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

如何在Raku对象上使用<...>语法替代字符串参数的()调用?

让Raku对象支持<...>语法调用的解决方案

<...>语法在Raku中对应关联容器的索引操作,而非CALL-ME方法调用。默认只有实现Associative角色的类型才能使用该语法,这就是原代码报错的原因。要解决这个问题,有两种标准实现方式:

方式一:混入Associative角色并实现核心方法

让类混入Associative角色,然后实现AT-KEY方法(关联容器索引时会触发此方法),同时保留CALL-ME逻辑:

use v6.d;
class A does Associative {
    has %.x;
    
    method CALL-ME(Str:D $key) { say %!x{$key} }
    method AT-KEY(Str:D $key) { %!x{$key} }
    
    # 可选:若需要支持赋值操作,添加以下方法
    # method ASSIGN-KEY(Str:D $key, $value) { %!x{$key} = $value }
}

my A $q .= new(:x(<one two three> Z=> 1..*));
$q('two');   # 输出 2
say $q<two>; # 输出 2

方式二:复用逻辑减少代码冗余

让CALL-ME调用AT-KEY方法,避免重复编写哈希访问逻辑:

use v6.d;
class A does Associative {
    has %.x;
    
    method AT-KEY(Str:D $key) { %!x{$key} }
    method CALL-ME(Str:D $key) { say self.AT-KEY($key) }
}

my A $q .= new(:x(<one two three> Z=> 1..*));
$q('two');   # 输出 2
say $q<two>; # 输出 2

补充说明

如果仅需支持<...>语法触发类似CALL-ME的行为,也可以自定义postcircumfix:<[ ]>方法,但混入Associative角色是更符合Raku类型系统设计的标准方案,能自动兼容关联容器的其他特性(如迭代、存在性检查等)。

内容的提问来源于stack exchange,提问作者Richard Hainsworth

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 07:32:35