无Sigil变量,常量,绑定:何时选择什么

时间:2019-03-17 19:01:20

标签: perl6

因此,从文档中几乎可以清楚标题中的三个实体是什么,但是不清楚它们的目的是什么。

常量在许多语言中都很常见。您不想在整个代码中编写3.14,这就是为什么要定义一个常量PI的原因,该常量根据其所代表的事物的性质不能更改,因此其值就是恒定

:=定义绑定到另一个实体的变量也是很清楚的,但实际上不是。如果我将变量绑定到3.14,是否与定义PI常量相同? $a := $b是实际上将$a定义为$b别名还是其他引用的引用?另外,在某些语言中,引用通常用于在对象构造或函数调用中明确表示您不想在周围复制对象,但是为什么在相同范围内使用它会很有用

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

最后,文档解释了如何可以定义无符号变量(不能改变,因此,实际上是另一种常量),而不是为什么去做。无符号变量可解决哪些问题?变量,常量,绑定变量不能解决无符号变量所解决的问题时的实际情况是什么?

3 个答案:

答案 0 :(得分:10)

  

常量在许多语言中都很常见。您不想在整个代码中编写3.14,这就是为什么要定义一个恒定的PI,而该PI本质上不能更改,这就是为什么它的值在时间上恒定的原因。

为此,您使用constant

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),我个人更倾向于使用斜线标记,否则使用sigil。 YMMV。

  

无符号变量可解决哪些问题?变量,常量,绑定变量不能解决无符号变量所解决的问题时的实际情况是什么?

如果我的答案(或其他内容;我看到其他人已发布了一个内容)给您留下了其他问题,请添加评论。

脚注

1 参见my answer to JJ's SO about use of constant with composite containers

答案 1 :(得分:6)

那不是一个问题,而是五个问题?

  

如果我将变量绑定到3.14,是否与定义PI常量相同?

从技术上讲,除了3.14Rat,而pi(又名π)是Num之外,是这样。< / p>

  

$ a:= $ b实际上是将$ a定义为$ b的别名还是其他引用所称的引用?

这是一个别名。

  

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

没有什么意义。但是,有时可以方便地为数组中的元素或哈希中的键添加别名,以防止重复查找:

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

无符号变量可以解决什么问题?

据我所知,无Sigilent变量只能解决编程风格问题。无论出于何种原因,有些人都喜欢无印记的物品。这使得插值变得更加困难,但是其他人可能会发现多余的curl实际上是一件好事:

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

当变量,常量,绑定变量不能解决无符号变量所解决的问题时,实际情况是什么?

在我看来,无符号变量不会解决问题,而是尝试迎合不同的编程风格。因此,我不确定该问题的正确答案是什么。

答案 2 :(得分:1)

默认情况下,constant的范围是our,而不是my的范围。