gpt4 book ai didi

hash - 那是 Perl 6 哈希还是 block ?

转载 作者:行者123 更新时间:2023-12-04 00:12:31 25 4
gpt4 key购买 nike

这是一个有点出乎意料的行为,可能会咬到初学者。首先,这是故意的吗?其次,Perl 6 还使用哪些其他东西来猜测要创建哪个对象?它是开始认为是 Block 还是 Hash 并稍后更改,还是最终决定?

您可以构建一个 Hash带括号和粗箭头:

my $color-name-to-rgb = {
'red' => 'FF0000',
};

put $color-name-to-rgb.^name; # Hash

使用其他 Pair 符号创建 Hash也。
my $color-name-to-rgb = {
:red('FF0000'),
};

但是,没有粗箭头,我得到一个 Block反而:
my $color-name-to-rgb = {
'red', 'FF0000',
};

put $color-name-to-rgb.^name; # Block

Hash文档只提到使用 $_在大括号内创建一个 Block .

还有其他定义散列的方法,但我问的是这个特定的语法,而不是寻找我已经知道的解决方法。
$ perl6 -v
This is Rakudo version 2017.04.3 built on MoarVM version 2017.04-53-g66c6dda
implementing Perl 6.c.

最佳答案

当它是 Hash您的问题 1 和此答案仅适用于术语位置 2 中的支撑块。
严格遵循下面解释的规则的花括号代码构造了一个 Hash :

say WHAT {                  }             # (Hash)
say WHAT { %foo } # (Hash)
say WHAT { %foo, ... } # (Hash)
say WHAT { foo => 42, ... } # (Hash)
say WHAT { :foo, ... } # (Hash)
say WHAT { key => $foo, ... } # (Hash)
规则
如果块为空,或仅包含第一个元素为 % 的列表标记变量(例如 %foo )或 文字 对(例如 :bar ),并且它没有签名或包含顶级语句,它是一个 Hash .否则它是 Block .
给力 BlockHash解释
  • 强制一个 {...}构造 Block 的术语而不是 Hash , 写个 ;在开始时,即 { ; ... } .
  • 写一个空Block术语,写 {;} .
  • 写一个空Hash术语,写 {} .
  • 强制一个 {...}构造 Hash 的术语而不是 Block ,遵循规则(在本答案的其余部分详细解释),或写 %(...)反而。

  • 显式签名意味着它是 Block一些花括号代码具有显式签名,即它具有显式参数,例如 $foo以下。它总是构造一个 Block无论大括号内是什么:
    say WHAT         { key => $foo, 'a', 'b' } # (Hash)
    say WHAT -> $foo { key => $foo, 'a', 'b' } # (Block)
    隐式签名也意味着它是 Block某些花括号代码具有隐式签名,该签名是由于块内的某些显式编码选择而生成的:
  • 在内部使用“代词”{...}意味着它是 Block带有签名(如果它还没有显式签名,则为隐式签名)。代词是$_ , @_ , 和 %_ .
  • 这包括暗示使用 $_{...}由于 .method没有左侧参数的调用。换句话说,即使 { .foo }由于 (;; $_? is raw) 有一个签名 ( .foo )缺乏左手边的论点。
  • 使用“占位符”变量(例如 $^foo )。

  • 与显式签名一样,如果花括号代码具有隐式签名,那么它总是构造一个 Block无论大括号内是什么:
    say WHAT { key => $_ }                     # (Block)
    say WHAT { key => 'value', .foo, .bar } # (Block)
    顶级声明意味着它是一个 Block
    say WHAT { :foo; (do 'a'), (do 'b') }     # (Block)
    say WHAT { :foo, (do 'a'), (do 'b') } # (Hash)
    第二行包含多个语句,但它们在作为单个顶级表达式的列表的各个元素中生成值。
    标识符的顶级声明意味着它是 Block声明就是声明,但我已经包含了这一部分,以防万一有人没有意识到这一点。
    say WHAT { :foo, $baz, {my $bar} }        # (Hash)
    say WHAT { :foo, $baz, (my $bar) } # (Block)
    第一行包含一个 Block作为包含声明( my $bar )的键。但是那个声明属于内部 {my $bar} Block ,不是外 {...} .所以内部 Block就外部 {...} 而言只是一个值关注,因此外括号代码仍被解释为 Hash .
    相比之下,第二行直接在外部 {...} 中声明了一个变量。 .所以它是一个 Block .
    Block s,不是 Hash
    回想一下,成为 Hash , 花括号代码的内容必须是一个以 % 开头的列表标记变量或 文字 一对。所以这些都产生 Block s:
    my $bar = key => 'value';
    say WHAT { $bar, %baz } # (Block)
    say WHAT { |%baz } # (Block)
    say WHAT { %@quux } # (Block)
    say WHAT { 'a', 'b', key => $foo } # (Block)
    say WHAT { Pair.new: 'key', $foo } # (Block)
    脚注
    1 这个“ HashBlock ?”问题是 DWIM 的一个例子设计。在 Raku 文化中,好的 DWIM 设计被认为是一件好事。但是每个 DWIM 都带有相应的 WAT3。良好的 DWIM 设计的关键是确保 WAT 的 barks are worse than their bites 4;并且树皮很有用5;并且 DWIM 的净 yield 被认为远远超过所有的吠叫和叮咬。 6
    2 术语是 Raku 对英语中名词或名词短语的类比。这是一个值(value)。
    作为术语的支撑块的示例:
    .say given { ... }  # closure? hash?
    say 42, { ... } # closure? hash?
    不是术语的支撑块的示例:
    if True { ... }     # always a closure
    class foo { ... } # always a package
    put bar{ ... } # always a hash index
    此答案仅讨论作为术语的支撑块。有关术语的更多详细信息,或更具体地说是“术语位置”(语法中花括号块将被解释为术语的位置),请参阅此答案下方的注释。
    3 WAT指的是当某事对他们来说似乎很疯狂时,开发人员感到难以置信的惊讶。众所周知,即使是设计良好的 DWIM,对于每个对大多数人都有效的 DWIM,在大多数情况下,不可避免地会有一个或多个相关的 WAT 让一些人感到惊讶,有时,包括一些相同的人其他时候受益于 DWIM。
    4 与此 DWIM 相关的 WAT 的作用各不相同。它通常是使问题显而易见的吠叫(错误消息)。但它也可以更加模糊:
    say { a => 42 }() ;  # No such method 'CALL-ME' for invocant of type 'Hash'   WAT? Oh.
    say { a => $_ }<a> ; # Type Block does not support associative indexing. WAT? Oh.

    say { a => $_, b => 42, c => 99 } .elems # 1 WAT?????
    5 “bark”是文档中的错误消息或警告。这些通常可以改进。参见 Lock.protect({}) fails, but with surprising message .
    6 社区成员对于 DWIM 设计是否值得,或任何特定的 DWIM 是否值得持有不同意见。参见 my perspective vs Sam 对这个问题的回答。

    关于hash - 那是 Perl 6 哈希还是 block ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44101411/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com