我想获得一个指向对象方法的指针,例如此类

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,错误逐渐蔓延至ba​​r本身,这意味着该对象本身不会进入。

我有checked out this answer,但是它是用于类方法(新方法)的,它涉及使用元对象协议(protocol)。会有更简单的方法吗?

最佳答案

您可以使用 .^lookup 获得“静态”方法(^指示它是对元对象的调用)。

该方法没有以任何方式绑定(bind)到激进的$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);

您可以使用闭包将方法绑定(bind)到发起者:
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) }

10-06 13:39
查看更多