我想获得一个指向对象方法的 pointer ,例如针对此类的
class Foo {
has $thing = "baz";
method bar() { say $thing }
};
sub quux( Callable $flimflam ) {
$flimflam()
};
my $foo = Foo.new;
我想获取$foo.bar
方法指针,以将其粘贴到quux。但是,
quux(&($foo.bar))
失败Type check failed in binding to parameter '$flimflam'; expected Callable but got Bool (Bool::True) in sub quux
这也不起作用
quux($foo.bar)
可能是因为它不带任何参数。但是,如果我们将bar
的定义更改为:
method bar($some ) { say $some ~ $thing }
然后上述调用的错误变为Too few positionals passed; expected 2 arguments but got 1 in method bar
,错误逐渐蔓延至bar本身,这意味着该对象本身不会进入。
我有checked out this answer,但它是用于类方法(新方法)的,它涉及使用元对象协议。会有更简单的方法吗?
答案 0 :(得分:5)
您可以使用.^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);
您可以使用闭包将该方法绑定到发起者:
my $bound_method = -> |c { $method_bar($foo, |c) }
Perl 6也为此内置了一个快捷方式:
my $bound_method = $method_bar.assuming($foo);
但是您可以看到您可以将整个缩写为
my $callback = { $foo.bar() }
或者该方法可能需要更多的参数
my $callback = -> |c { $foo.bar(|c) }