【问题标题】:perl 6 variable same name different sigils inconsistent behaviorperl 6变量同名不同的符号不一致的行为
【发布时间】:2017-08-01 17:17:19
【问题描述】:

当使用相同字母名称但不同符号的变量时,似乎存在一些不一致的行为:

> my $a="foo";
foo
> my @a=1,2
[1 2]
> say $a
foo               # this is what I have expected
> my $b = 1,2,3
(1 2 3)
> my @b = (0, $b.Slip)
[0 1]             # I expect to get [0 1 2 3]; (0, |$b) not work either
> say $b
1                 # I expect $b to be unchanged, (1,2,3), but it is now 1;
> say @a
[1 2]
> say @b
[0 1]
>

我不确定为什么@a 不会影响$a,而@b 会影响$b。有人能解释一下吗?

谢谢!!!

lisprog

【问题讨论】:

    标签: variables raku sigils


    【解决方案1】:

    在 Rakudo Perl 6 中,$b@b 之间实际上根本没有关系。

    $b 没有改变。它根本没有被分配到您认为已分配的内容。查看Operator Precedence 上的文档,您会发现=(赋值)比逗号, 具有更严格的优先级。

    另外,您正在使用 REPL,它会自动打印出每个语句的返回值。该返回值可能与分配给变量的值相同,也可能不同。

    my $b = 1,2,3 实际上与
    (my $b = 1),2,3 相同,因为= 的优先级比, 更严格,这意味着实际上除了第一个值之外的所有值都会被忽略

    > (my $b = 1),2,3
    (1 2 3)
    > $b
    1
    

    如果您想为$b 分配一个列表,请在列表周围加上括号:

    > my $b = (1,2,3)
    (1 2 3)
    > $b
    (1 2 3)
    

    【讨论】:

    • 非常感谢克里斯托弗!我现在明白了,而且 Slip 也有效!谢谢!
    • 有人可能会争辩说my $b = 1,2,3 应该警告将值23 放在地板上。
    • @ElizabethMattijsen 该警告是否类似于Useless use of constant in sink context. Did you mean to assign a list to Scalar?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-12-17
    • 1970-01-01
    • 2019-08-18
    • 2014-11-23
    • 2013-07-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多