簡體   English   中英

`state` 和 `const` 有什么區別?

[英]What is the difference between `state` and `const`?

它似乎類似於寫:

use Const::Fast;
const $xx, 77;
sub test {
    do_something_with( $xx );    
}

或者

sub test {
    state $xx =  77;
    do_something_with( $xx );    
}

實現此目的的更好方法是什么:通過const或通過state

sub get_ip_country {
    my ($ip_address) = @_;
    my $ip_cc_database = GeoIP2::Database::Reader->new(file => '/etc/project/GeoLite2-Country.mmdb');
    ...
}

UPD
在這個 sub 我不改變指針到geoip 數據庫,所以它應該是const 但是我不想每次調用 sub 時都重新創建 object (這很慢)。 所以我想使用state會更快,盡管指針沒有改變。

看來應該是const state $ip_cc_database

他們不做同樣的事情。

  • state聲明了一個變量,該變量僅在您第一次進入 function 時才會被初始化。 雖然它是可變的,所以你可以改變它的值,但它會在調用相同的 function 之間保持值。 例如,該程序將打印7879
     sub test { state $xx = 77; # initialization only happens once print ++$xx. "\n"; # step the current value and print it } test; # 78 test; # 79
  • const聲明一個不可變(只讀)變量,如果在 function 中聲明,則每次調用 function 時都會重新初始化該變量。

如果你想要一個恆定的值,那么你應該使用類似Const::Fast的東西。

但是,如果您想要一個可以更改的值,但在調用 function 之間保留其值,那么您需要一個state 變量

所以運行,這個:

sub test {
  state $x = 1;

  say $x++;
}

test() for 1 .. 10;

給出了這個:

1
2
3
4
5
6
7
8
9
10

但是運行這個:

use Const::Fast;

sub test {
  const my $x, 1;

  say $x++;
}

test() for 1 .. 10;

給出運行時錯誤:

Modification of a read-only value attempted at const_test line 12.

正如@TedLyngmo 在對您的 OP 的評論中指出的那樣, const state無效 Perl。 const是一個編譯指示,因此在編譯時起作用,而state是一個運行時構造。

就您的效率要求而言, GeoIP2::Database::Reader構造函數只調用一次,兩者都可以。 如果您進一步希望它是只讀的,這樣您就不會無意中使引用無效,您仍然可以同時使用兩者。 const會自動為您執行此操作,但您可以使用state與間接層復制該行為:

sub ip_cc_database {
   state $db = GeoIP2::Database::Reader->new(file => '/etc/project/GeoLite2-Country.mmdb');
}
sub get_ip_country {
    my ($ip_address) = @_;
    my $ip_cc_database = ip_cc_database();
    ...
}

關於何時使用一個而不是另一個的問題的答案有點微妙。

這兩種方法的真正區別在於調用構造函數的時間。 使用const是在編譯階段,使用state是在運行時。

如果您的應用程序總是調用get_ip_country ,並且您不關心在進程的生命周期內攤銷啟動成本,則const更簡單。

但是,如果您不總是調用get_ip_country ,並且創建GeoIP2::Database::Reader object 的成本很高,那么使用state意味着您只需在需要時支付該成本。

還需要考慮用戶體驗。 如果您的程序是交互式的,或者如果它在您需要調用get_ip_country之前開始生成 output ,則延遲創建 object 直到它真正需要它意味着您的程序不會只是坐在那里看似什么都不做,直到所有的啟動完成。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM