You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

是否可为参数化角色添加定义性约束?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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 11:43:12