首页 > 解决方案 > 实例化对象的方法语法:似乎无法正确

问题描述

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

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 本身,这意味着对象本身没有进入。

我已经检查了这个答案,但它是一个类方法(新),它涉及使用元对象协议。会有更简单的方法吗?

标签: functional-programmingraku

解决方案


您可以获得“静态”方法.^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) }

推荐阅读