如何获得“< ...对象上>的语法?

How to get the `< ... >` syntax on an object?

提问人:Richard Hainsworth 提问时间:11/13/2023 最后编辑:Elizabeth MattijsenRichard Hainsworth 更新时间:11/13/2023 访问量:277

问:

在 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
对象 raku 调用约

评论

0赞 raiph 11/13/2023
cf 句柄有问题
0赞 raiph 11/13/2023
更改为意味着您的示例有效。这在逻辑上是 Liz 在我链接的讨论中的评论。但是,根据 AJS 在该线程中所说的话,我暗示不保证此解决方案的一般适用性。has %.x;has %.x handles <AT-KEY>;
0赞 codesections 11/13/2023
@raiph,r/rakulang 线程已关闭,但我同意你在那里所说的.这个问题可以通过以下方式解决class Foo is Hashnewmethod new(|c) { self.Any::new(|c) }

答:

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 %.xhandles
0赞 raiph 11/13/2023
@codesections 正确。