jjm*_*elo 7 functional-programming perl6
我想得到一个指向对象方法的指针,例如这个类
class Foo {
has $thing = "baz";
method bar() { say $thing }
};
sub quux( Callable $flimflam ) {
$flimflam()
};
my $foo = Foo.new;
Run Code Online (Sandbox Code Playgroud)
我想抓住$foo.bar方法指针将它传递给quux.但是,这个
quux(&($foo.bar))
Run Code Online (Sandbox Code Playgroud)
失败了 Type check failed in binding to parameter '$flimflam'; expected Callable but got Bool (Bool::True)? in sub quux
这也不起作用
quux($foo.bar)
Run Code Online (Sandbox Code Playgroud)
也许是因为它没有参数; 但是,如果我们将定义更改bar为:
method bar($some ) { say $some ~ $thing }
Run Code Online (Sandbox Code Playgroud)
然后上面调用Too few positionals passed; expected 2 arguments but got 1? in method bar的错误变为,错误爬到bar本身,这意味着对象本身没有进入.
我已经检查了这个答案,但这是一个类方法(新),它涉及使用元对象协议.会有更简单的方法吗?
您可以使用.^lookup(^表示它是对元对象的调用)获取"静态"方法.
该方法不以$foo任何方式绑定到调用者,因此您必须将其称为
class Foo {
has $thing = "baz";
method bar() { say $thing }
};
sub quux( Callable $flimflam ) {
$flimflam()
};
my $foo = Foo.new;
my $method_bar = $foo.^lookup('bar');
$method_bar($foo);
Run Code Online (Sandbox Code Playgroud)
您可以使用闭包将方法绑定到调用者:
my $bound_method = -> |c { $method_bar($foo, |c) }
Run Code Online (Sandbox Code Playgroud)
Perl 6还有一个内置的快捷方式:
my $bound_method = $method_bar.assuming($foo);
Run Code Online (Sandbox Code Playgroud)
但你可以看到你可以将整个事物缩写为
my $callback = { $foo.bar() }
Run Code Online (Sandbox Code Playgroud)
或者如果该方法可能需要更多参数
my $callback = -> |c { $foo.bar(|c) }
Run Code Online (Sandbox Code Playgroud)