【问题标题】:Sigilless variables, constants, bindings: when to choose what无符号变量、常量、绑定:何时选择什么
【发布时间】:2019-03-17 19:01:19
【问题描述】:

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

常量在许多语言中都很常见。你不想在你的代码中写3.14,这就是为什么你定义一个常量PI,根据它所代表的事物的性质,它不能被改变,这就是为什么它的值是常量 em> 及时。

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

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

?

最后,文档解释了如何定义一个无符号变量(不能改变,因此实际上是另一种常量),但没有解释为什么去做。无符号变量解决了哪些问题?当变量、常量、绑定变量不能解决无符号变量解决的问题时,实际场景是什么?

【问题讨论】:

  • 当您事先不知道要绑定什么时,通常会选择无符号变量。如果它可以是位置的、关联的、标量......那么一个无符号变量就是你的东西。这就是为什么它经常在方法和子原型中使用。
  • "当您事先不知道它会绑定什么时,您通常会选择一个无符号变量。"对于对此感到困惑的读者,因为他们认为一个必须知道代码是否为my \foo = ...,JJ 不是普通变量而是例程中的参数签名。

标签: raku


【解决方案1】:

常量在许多语言中都很常见。你不想在你的代码中写满 3.14,这就是为什么你定义一个常量 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),我个人更喜欢削减符号,否则使用符号。 YMMV。

无符号变量解决了哪些问题?当变量、常量、绑定变量不能解决无符号变量解决的问题时,实际场景是什么?

如果我的答案(或另一个;我看到其他人已发布)中已经存在的问题给您留下了剩余的问题,请添加 cmets。

脚注

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

【讨论】:

    【解决方案2】:

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

    如果我将一个变量绑定到 3.14,是不是和定义一个 PI 常量一样?

    嗯,从技术上讲,除了 3.14Ratpi(又名 π)是 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;
    

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

    据我所知,无符号变量只能解决编程风格问题。有些人,无论出于何种原因,更喜欢无符号变量。这使得插值变得更加困难,但其他人可能会发现额外的卷曲实际上是一件好事:

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

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

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

    【讨论】:

      【解决方案3】:

      constant 也是our 默认作用域。

      【讨论】:

      猜你喜欢
      • 2019-01-16
      • 2010-10-11
      • 2021-07-30
      • 1970-01-01
      • 2016-09-10
      • 1970-01-01
      • 1970-01-01
      • 2012-06-22
      • 2012-02-19
      相关资源
      最近更新 更多