【发布时间】:2021-11-07 20:14:16
【问题描述】:
与我的previous question 一样,我无法判断我是否遇到了错误或对 Raku 语义的理解存在漏洞。上次发现是个bug,但怀疑闪电会两次!
一般来说,我知道我可以将命名参数传递给函数,或者使用看起来很像创建 Pair 的语法(例如 f :a(42))或使用 looks a lot like 展平哈希的语法(例如 f |%h )。 (请参阅文档中的argument destructuring)。通常,这两个是等价的,即使对于非标量参数:
sub f(:@a) { dd @a }
my %h = a => [4, 2];
f :a([4,2]); # OUTPUT: «Array element = [4, 2]»
f |%h; # OUTPUT: «Array element = [4, 2]»
但是,当使用默认的.new构造函数构造对象时,这两种形式似乎给出了不同的结果:
class C { has @.a; }
my %h = a => [4, 2];
C.new: :a([4,2]; # OUTPUT: «C.new(a => ([[4, 2]])»
C.new: |%h; # OUTPUT: «C.new(a => [[4, 2],])»
也就是说,传递:a([4,2]) 会生成一个二元素数组,但使用参数展平语法会生成一个包含二元素数组的一元素数组。
这种行为是有意的吗?如果是这样,为什么?是否有语法可以用来传递|%h 并获取绑定到@-sigiled 属性的二元素数组? (我知道使用$-sigiled 属性有效,但我更喜欢@ 的语义)。
【问题讨论】:
标签: arrays constructor raku destructuring rakudo