Константы распространены во многих языках.Вы не хотите писать 3.14 по всему своему коду, и поэтому вы определяете постоянный PI, который по природе того, что он представляет, не может быть изменен, и поэтому его значение постоянно во времени.
Для этого вы используете constant
.
A constant
инициализируется только один раз, при первом обнаружении во время компиляции, и никогда больше, поэтому его значение остается постоянным на протяжении всего выполнения программы.На это может положиться компилятор.Так может и читатель - при условии, что он четко понимает, что означает «ценность» в этом контексте. 1
Например:
BEGIN my $bar = 42;
loop {
constant foo = $bar;
$bar++;
last if $++ > 4;
print foo; # 4242424242
}
Обратите внимание, что если вы неесли бы у нее было BEGIN
, тогда константа была бы инициализирована и застряла со значением (Any)
.
Я склонен пропустить сигилу, чтобы несколько подкрепить идею, что это константа, но вы можете использовать сигилуесли вы предпочитаете.
Определение переменной, связанной с другим объектом с помощью :=
, также почти ясно, но не совсем.Если я связываю переменную с 3.14
, разве это не то же самое, что определение константы PI
?Действительно ли $a := $b
определяет $a
как псевдоним $b
или, как его называют некоторые другие языки, ссылку?
Связывание просто связывает идентификаторы.Если любое из них изменяется, они оба делают:
my $a = 42;
my $b := $a;
$a++;
$b++;
say $a, $b; # 4444
Наконец, документация объясняет, как можно определить переменную без сигилов (которая не может быть изменена, поэтому, фактически, другой вид константы), но не почемуможно было бы сделать это.
Это может быть изменено, если привязанная вещь является переменной.Например:
my $variable = 42; # puts the value 42 INTO $variable
my \variable = $variable; # binds variable to $variable
say ++variable; # 43
my \variable2 = 42; # binds variable2 to 42
say ++variable2; # Cannot resolve caller prefix:<++>(Int:D);
# ... candidates ... require mutable arguments
Я лично предпочитаю сокращать сигилы, если идентификатор связан с неизменяемым базовым скалярным значением (например, 42
) или другим полностью неизменным значением (например, типичным List
) и используюСигил в противном случае.YMMV.
Какие проблемы решают переменные без сигилов?Каков практический сценарий, когда переменная, константа, переменная привязки не решают проблему, которую решает переменная без сигил?
Пожалуйста, добавьте комментарии, если что уже есть в моем ответе (или другом; я вижу кого-тоеще один опубликовал один) оставляет вас с остальными вопросами.
Foonotes
1 См. мой ответ SO JJ об использовании constant
с составными контейнерами .