与我之前的问题一样,在这个领域我无法判断我对 Raku 语义的理解是否遇到了错误或漏洞。上次竟然是bug,不过怀疑闪电会劈两次!
\n一般来说,我知道我可以使用看起来很像创建 Pair 的语法(例如f :a(42))或使用看起来很像展平哈希的语法(例如f |%h)将命名参数传递给函数。(请参阅文档中的参数解构)。通常,这两者是等效的,即使对于非标量参数也是如此:
sub f(:@a) { dd @a }\nmy %h = a => [4, 2];\nf :a([4,2]); # OUTPUT: \xc2\xabArray element = [4, 2]\xc2\xbb\nf |%h; # OUTPUT: \xc2\xabArray element = [4, 2]\xc2\xbb\nRun Code Online (Sandbox Code Playgroud)\n然而,当使用默认构造函数构造对象时.new,这两种形式似乎给出了不同的结果:
class C { has @.a; }\nmy %h = a => [4, 2];\nC.new: :a([4,2]; # OUTPUT: \xc2\xabC.new(a => ([[4, 2]])\xc2\xbb\nC.new: |%h; # OUTPUT: \xc2\xabC.new(a => [[4, 2],])\xc2\xbb\nRun Code Online (Sandbox Code Playgroud)\n …