Destructuring/list 使用 `has` 声明符赋值

Destructuring/list assignment with the `has` declarator

[我 运行 同时研究了引发这个问题和我的 的问题,但认为这两个问题应该分开。]

文档描述了将 destructuring assignmentmyour 变量一起使用,但没有提及它是否可以与 has 变量一起使用。但 Raku 足够稳定,我决定尝试一下,它 似乎 有效:

class C { has $.a; has $.b }
class D { has ($.a, $.b) }
C.new: :a<foo>;  # OUTPUT: «C.new(a => "foo", b => Any)»
D.new: :a<foo>;  # OUTPUT: «D.new(a => "foo", b => Any)»

但是,这种形式似乎破坏了属性默认值:

class C { has $.a; has $.b = 42 }
class D { has ($.a, $.b = 42) }
C.new: :a<foo>;  # OUTPUT: «C.new(a => "foo", b => 42)»
D.new: :a<foo>;  # OUTPUT: «C.new(a => "foo", b => Any)»

此外,翻转默认值的位置会提供一条错误消息,可能会一些洞察正在发生的事情(尽管我无法理解上述行为是否正确)正确)。

class D { has ($.a = 42, $.b) }
# OUTPUT:
===SORRY!=== Error while compiling:
Cannot put required parameter $.b after optional parameters

那么,有几个问题:解构赋值甚至 应该 has 一起工作吗?如果是这样,使用默认值 correct/is 的行为是否有在使用解构赋值时分配默认值的方法?

(我真的希望 支持 has 并且可以使用默认值工作;尽管它看起来像是一个小众功能对于真正的 OO 使用 classes 的人,它 非常 对于编写更多功能代码并希望使用 class 作为类型安全性稍高的散列的人来说非常方便固定键。能够编写像 class User { has (Str $.first-name, Str $.last-name, Int $.age) } 这样的东西 非常 对这类代码有帮助)

目前这是一个 known bug in Rakudo. The intended behavior is for has to support list assignment,这将使语法非常像问题中所示的那样有效。

我不确定支持的语法是否是:

class D { has ($.a, $.b = 42) }
D.new: :a<foo>;  # OUTPUT: «D.new(a => "foo", b => 42)»

class D { has ($.a, $.b) = (Any, 42) }
D.new: :a<foo>;  # OUTPUT: «D.new(a => "foo", b => 42)»

但是,无论哪种方式,都可以使用单个 has 来声明多个属性,同时还为这些属性提供默认值。

目前预计这个错误会在 RakuAST 分支合并后的某个时间得到解决。