提问人:Richard Hainsworth 提问时间:11/13/2023 最后编辑:Elizabeth MattijsenRichard Hainsworth 更新时间:11/13/2023 访问量:277
如何获得“< ...对象上>的语法?
How to get the `< ... >` syntax on an object?
问:
在 Raku 中:当我使用 CALL-ME 方法创建对象时,我想使用签名的语法而不是 when is a Str。
在文档中,有一个创建运算符的示例,该运算符是具有特殊语法的普通 Raku sub。这种子会自动转换为 Str。
例如,如果我有< ... >
( '...' )
...
< ... >
use v6.d;
class A {
has %.x;
method CALL-ME( Str:D $key ) { say %!x{ $key } }
}
my A $q .= new( :x( <one two three> Z=> 1..* ) );
$q('two');
$q<two>;
但这会产生
2
Type A does not support associative indexing.
in block <unit> at test.raku line 10
答:
9赞
codesections
11/13/2023
#1
基于@raiph评论的答案:
您需要在类型上实现 AT-KEY
方法。
您可以像这样直接执行此操作:
class A {
has %.x;
method CALL-ME( Str:D $key ) { say %!x{ $key } }
method AT-KEY($key) { self.($key) }
}
或者,您可以通过委托给使用句柄
特征来做到这一点:AT-KEY
%!x
class A {
has %.x handles <AT-KEY>;
method CALL-ME( Str:D $key ) { say %!x{ $key } }
}
评论
0赞
codesections
11/13/2023
@raiph但是,如果我正确阅读了 reddit 线程,那么您的 AJS 建议的更改和您的更改都不会改变 的语义,对吗?(差不多是或,对吧?handles <AT-KEY>
handles *
handles '*'
0赞
Richard Hainsworth
11/13/2023
在问题中,我使用了最小结构。在我正在处理的代码中,哈希确实存在几层,因此 a 并不是一个真正的选项。AT-KEY 方法是更通用的路由。has %.x
handles
0赞
raiph
11/13/2023
@codesections 正确。
评论
has %.x;
has %.x handles <AT-KEY>;
class Foo is Hash
new
method new(|c) { self.Any::new(|c) }