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

问题描述 投票:8回答:3

因此,从文档中可以清楚地了解标题中的三个实体是什么,但目的并不是很明确。

常量在许多语言中很常见。你不想在你的代码中编写3.14,这就是为什么你定义一个常量PI,根据它代表的东西的性质,它不能被改变,这就是为什么它的值在时间上是恒定的。

使用:=定义绑定到另一个实体的变量也几乎是清楚但不是真的。如果我将变量绑定到3.14,是不是与定义PI常量相同? $a := $b实际上是将$a定义为$b的别名,还是像其他一些语言所称的那样引用?此外,在某些语言中通常使用引用,以便在对象构造或函数调用中清楚地表明您不希望复制对象,但为什么在相同的范围内使用它们会有用呢?

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

?

最后,文档解释了如何定义一个无法变量(不能改变,实际上,另一种常量)但不是为什么会这样做。无意义变量解决了哪些问题?当一个变量,一个常量,一个绑定变量无法解决一个无形变量解决的问题时,实际情况是什么?

perl6
3个回答
10
投票

常量在许多语言中很常见。您不希望在代码中编写3.14,这就是为什么要定义一个常量PI,根据它所代表的东西的性质,它不能被改变,这就是为什么它的值在时间上是恒定的。

为此,你使用constant

constant仅在编译期间首次遇到时初始化一次,并且从不再次初始化,因此其值在整个程序运行期间保持不变。编译器可以依赖它。读者也是如此 - 只要他们清楚地理解“价值”在这种情况下意味着什么

例如:

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。因人而异。

无意义变量解决了哪些问题?当一个变量,一个常量,一个绑定变量无法解决一个无形变量解决的问题时,实际情况是什么?

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

Foonotes

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


7
投票

这不是一个而是5个问题?

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

好吧,从技术上来说,除了3.14Rat,而pi(又名π)是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;

无意义变量解决了哪些问题?

据我所知,Sigilless变量只能解决编程风格问题。无论出于何种原因,有些人更喜欢无瑕疵的变体。它使插值更难,但其他人可能会发现额外的curlies实际上是一件好事:

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

当一个变量,一个常量,一个绑定变量无法解决一个无形变量解决的问题时,实际情况是什么?

在我看来,无意识的变量不能解决问题,而是尝试迎合不同的编程风格。所以我不确定这个问题的正确答案是什么。


1
投票

constant也是默认的our,而不是根据文档确定的my

© www.soinside.com 2019 - 2024. All rights reserved.