Destructuring/list 使用 `has` 声明符赋值
Destructuring/list assignment with the `has` declarator
[我 运行 同时研究了引发这个问题和我的 的问题,但认为这两个问题应该分开。]
文档描述了将 destructuring assignment 与 my
和 our
变量一起使用,但没有提及它是否可以与 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 分支合并后的某个时间得到解决。
[我 运行 同时研究了引发这个问题和我的
文档描述了将 destructuring assignment 与 my
和 our
变量一起使用,但没有提及它是否可以与 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 分支合并后的某个时间得到解决。