Raku参数化角色返回类型校验失败,是否用法有误?
Raku参数化角色返回类型错误的解决方法
你遇到的问题根源是参数化角色中,方法的箭头返回类型(--> T)里的T没有被正确替换为实例化后的具体类型。在类型检查阶段,这里的T被识别为角色的参数化类型变量本身,而非你传入的Str,所以返回Str值时会触发类型不匹配错误。
两种可行的修正方案:
方案一:使用returns关键字指定返回类型
这种写法会在角色被混入类时,正确将T替换为具体的参数类型:
my role R[::T] { has T $!a; method m ( T $v ) { $!a = $v; } method n returns T { $!a; } } my class C does R[Str] { } my C $c = C.new; $c.m: 'hello'; $c.n; # 正常返回"hello",无类型错误
方案二:在箭头返回类型中显式引用参数化类型变量
给T加上::前缀,明确指定这是角色的参数化类型变量,确保被正确替换:
my role R[::T] { has T $!a; method m ( T $v ) { $!a = $v; } method n ( --> ::T ) { $!a; } } my class C does R[Str] { } my C $c = C.new; $c.m: 'hello'; $c.n; # 正常运行
这两种写法都会让Raku在角色参数化实例化时,将T替换为你传入的Str类型,方法的返回类型约束就能正确匹配实际返回值,避免类型检查错误。
内容的提问来源于stack exchange,提问作者zjmarlow
相关产品推荐
相关产品推荐

