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

pis*_*hio 8 perl6

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

常数在许多语言中都很常见。您不想编写3.14所有代码,这就是为什么要定义一个常量PI,该常量由于其所代表的事物的性质而无法更改,因此其值在时间上是恒定的。

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

$number_of_cakes = 4;
$also_the_number_of_cakes := $number_of_cakes;
Run Code Online (Sandbox Code Playgroud)

最后,文档说明了如何定义无符号变量(不能改变,因此实际上是另一种常量),但没有解释为什么要这样做。无符号变量可解决哪些问题?当变量,常量,绑定变量不能解决无符号变量解决的问题时,实际情况是什么?

rai*_*iph 10

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

为此,您使用constant

A constant在编译期间首次遇到时仅初始化一次,而不会再次初始化,因此其值在程序运行期间保持恒定。编译器可以依靠它。只要读者清楚地了解“价值”在这种情况下的含义,读者也可以。1个

例如:

BEGIN my $bar = 42;

loop {
  constant foo = $bar;
  $bar++;
  last if $++ > 4;
  print foo; # 4242424242
}
Run Code Online (Sandbox Code Playgroud)

请注意,如果您没有,BEGIN则常量将被初始化并停留在的值上(Any)

我倾向于不使用印记,以在某种程度上加强它是常数的想法,但是如果您愿意,可以使用印记。

用定义绑定到另一个实体的变量:=也很清楚,但实际上不是。如果我将变量绑定到3.14,那么它与定义PI常量是一样的吗?被$a := $b实际定义$a为一个别名$b,或其他一些语言称呼它,一个参考?

绑定只是绑定标识符。如果其中一项发生更改,则它们都会:

my $a = 42;
my $b := $a;
$a++;
$b++;
say $a, $b; # 4444
Run Code Online (Sandbox Code Playgroud)

最后,文档说明了如何定义无符号变量(不能改变,因此实际上是另一种常量),但没有解释为什么要这样做。

如果绑定的事物是变量,则可以变化。例如:

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
Run Code Online (Sandbox Code Playgroud)

如果标识符绑定到不可变的基本标量值(例如42)或其他完全不可变的值(例如,典型值List),我个人更喜欢用斜线标记,否则使用sigil。YMMV。

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

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

脚注

1请参阅我对JJ的SO有关如何constant与复合容器一起使用的回答


Eli*_*sen 7

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

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

嗯,从技术上讲,除了事实3.14是a Ratpi(aka ?)是a之外Num

$ 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;
Run Code Online (Sandbox Code Playgroud)

无符号变量可解决哪些问题?

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

my answer := my $ = 42;
say "The answer is {answer}";
Run Code Online (Sandbox Code Playgroud)

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

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