是否可为参数化角色添加定义性约束?Raku语法问题问询
为参数化角色添加定义性约束的正确写法
你尝试给参数化角色添加:D定义性约束时出现的报错,是因为Raku解析器无法正确识别语法优先级。直接写R[Str]:D会让解析器错误地将:D判定为无效类型名称部分,以下是两种正确的写法:
方法参数声明的修正写法
写法一:用括号包裹参数化类型后加:D
role R[::T] { } class C { method m ( (R[Str]):D $a ) { } }
写法二:将:D放在角色名与参数列表之间
role R[::T] { } class C { method m ( R:D[Str] $a ) { } }
变量声明的修正写法
写法一:用括号包裹参数化类型后加:D
role R[::T] { } class S does R[Str] { } my (R[Str]):D $r = S.new;
写法二:将:D放在角色名与参数列表之间
role R[::T] { } class S does R[Str] { } my R:D[Str] $r = S.new;
原理说明
:D(表示“已定义的实例”)是Raku的类型副词,当作用于参数化类型时,需要明确其作用范围:
- 用括号包裹参数化类型,能让解析器识别
:D是作用于整个R[Str]类型; - 将
:D放在角色名和参数列表之间,直接表明这是R角色的已定义实例,同时指定参数为Str。
内容的提问来源于stack exchange,提问作者zjmarlow
相关产品推荐
相关产品推荐

