如何在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
相关产品推荐
相关产品推荐

