Объявление и присвоение переменных: бесшумное отбрасывание назначенных значений - PullRequest
0 голосов
/ 24 мая 2018

Вы можете объявить список переменных и присвоить им некоторое значение в Perl 6

my ($a, $b) = 33,44 # $a will be 33 and $b 44

Однако, если вы попытаетесь присвоить значение после объявления переменной, значениябудет тихо отброшен

my ($a = 44, $b = 33); 
say $a, $b; #OUTPUT: «(Any)(Any)␤» 

Оттуда становится страннее, так как

 my ($a = 44, $b);

терпит неудачу с:

===SORRY!=== Error while compiling /tmp/G7JgLMe1Wq
Cannot put required parameter $b after optional parameters

и

my ($a, $b = 33);

будет иметь тот же результат, что и назначение любого из них вместе.

Это поведение сбивает меня с толку.Должно ли это выдать предупреждение?Должно ли первое выражение также выдавать ту же ошибку о необязательных параметрах?Должны ли мы задокументировать это как trap ?Все вышеперечисленное?

1 Ответ

0 голосов
/ 24 мая 2018

Поведение можно понять, зная, что наряду с синтаксисом присваивания существует также синтаксис привязки сигнатуры, где левая часть имеет в основном все функции параметров в сигнатуре (за исключением пары функций NIY):

    <Zoffix__> m: my ($a, $b = 33) := \(); dd [$a, $b]
    <camelia> rakudo-moar 472f6e484: OUTPUT: «Too few positionals passed to '<unit>'; expected 1 or 2 arguments but got 0␤  in block <unit> at <tmp> line 1␤␤»
    <Zoffix__> m: my ($a, $b = 33) := \(100); dd [$a, $b]
    <camelia> rakudo-moar 472f6e484: OUTPUT: «[100, 33]␤»
    <Zoffix__> m: my ($a, $b = 33) := \(100, 200); dd [$a, $b]
    <camelia> rakudo-moar 472f6e484: OUTPUT: «[100, 200]␤»

Итак, вы объявляете необязательные параметры со значениями по умолчанию.Вот почему ваш следующий пример говорит о необходимых параметрах;вы не можете поставить обязательные после опций в рутинных подписях.Однако, поскольку вы фактически не выполняете никакой привязки, переменные остаются неназначенными.

будет автоматически отброшено

Возможно, мы сможем реализовать некоторую эвристику для обнаружения этого случая ипредупредить пользователя об этом, когда LHS выглядит как регистр подписи, а инициализатор отсутствует.Подано это как R # 1864 .

...