[英]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 之間保持值。 例如,該程序將打印78
和79
: 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.