Переменные без сигил, константы, привязки: когда выбирать что - PullRequest
8 голосов
/ 17 марта 2019

Итак, из документации почти ясно, каковы три сущности из названия, но не очень понятно, каково их назначение.

Константы распространены во многих языках.Вы не хотите писать 3.14 по всему своему коду, и поэтому вы определяете константу PI, которая по природе того, что она представляет, не может быть изменена, и поэтому ее значение равно константа * 1006.* во времени.

Определение переменной, связанной с другой сущностью с помощью :=, также почти ясно, но не совсем.Если я связываю переменную с 3.14, разве это не то же самое, что определение константы PI?Действительно ли $a := $b определяет $a как псевдоним до $b или, как его называют некоторые другие языки, ссылка ?Кроме того, ссылки, как правило, используются в некоторых языках, чтобы прояснить, при конструировании объекта или вызове функции, что вы не хотите копировать объект, но почему в той же области было бы полезно иметь

$number_of_cakes = 4;
$also_the_number_of_cakes := $number_of_cakes;

?

Наконец, документация объясняет как можно определить переменную без сигил (которая не может быть изменена, так что, фактически, еще один вид константы), но не почему можно было бы сделать это.Какие проблемы решают переменные без сигилов?Каков практический сценарий, когда переменная, константа, переменная связывания не решают проблему, которую решает переменная без сигил?

Ответы [ 3 ]

10 голосов
/ 17 марта 2019

Константы распространены во многих языках.Вы не хотите писать 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 с составными контейнерами .

7 голосов
/ 17 марта 2019

Это не один, а на 5 вопросов?

Если я связываю переменную с 3.14, разве это не то же самое, что определение константы PI?

Хорошотехнически это было бы за исключением того факта, что 3.14 является Rat, а pi (он же π) является Num.

Is $ a: = $b фактически определяет $ a как псевдоним $ b или, как его называют некоторые другие языки, ссылку?

Это псевдоним.

$ number_of_cakes = 4;$ также_the_number_of_cakes: = $ number_of_cakes;

Там было бы мало смысла.Однако иногда может быть полезно присвоить псевдоним элементу в массиве или ключу в хэше, чтобы предотвратить повторный поиск:

my %foo;
my $bar := %foo<bar>;
++$bar for ^10;

Какие проблемы решают переменные без сигилов?

Насколько мне известно, переменные без сигил решают только проблему стиля программирования.Некоторые люди по любой причине предпочитают переменные без сигил.Это усложняет интерполяцию, но другие могут посчитать дополнительные прокрутки действительно полезными:

my answer := my $ = 42;
say "The answer is {answer}";

Какой практический сценарий, когда переменная, константа, переменная привязки не решают проблемучто решают переменные без сигилов?

На мой взгляд, переменные без сигил не решают проблему, а скорее пытаются удовлетворить различные стили программирования.Поэтому я не уверен, каким будет правильный ответ на этот вопрос.

1 голос
/ 18 марта 2019

Также constant имеет значение по умолчанию our вместо my согласно документам.

...