【发布时间】:2019-01-31 02:27:55
【问题描述】:
我有这样的课:
class Foo {
method some-method(Str $name) { ... }
}
简单用法:
my $foo = Foo.new;
$foo.some-method("peter");
由于“some-method”会被非常频繁地调用,我想做一些事情来让用户像下面这样使用它:
$foo.peter;
我知道 FALLBACK 可以完成这项工作,但它已用于另一种方法。 我试图定义一个中缀运算符:
sub infix:<%>(Foo $foo, $name) {
$foo.some-method($name);
}
下面的代码可以工作,但是双引号很烦人。
$foo % "peter";
那么有什么办法可以避免引号呢?或者有什么方法可以简化调用?
【问题讨论】:
-
我为此使用了 FALLBACK,但由于您的 arg 是一个简单的 Str,您可以将其设为关联,只需使用方法 AT-KEY 并使用
$foo<peter>调用它。 -
FALLBACKsupports multi methods and subsignatures。只要您可以区分不同的调用(例如,通过检查方法名称或其参数),您就应该能够将它用于任意数量的方法。 -
这可行吗?必须运行并且尚未测试,但可能使用 MOP 生成和导出适当约束的后缀?类似(无 MOPing)
class c { module { sub postfix:<.foo> (c $_) is export { .say } } }; import c; c.foo; # (c). -
@raiph 使用前需要定义运算符吗?
-
@lovetomato 是的,你做到了。总是。否则 Perl 6 将不知道如何解析它。
标签: methods operator-keyword raku