gpt4 book ai didi

functional-programming - 实例化对象的方法语法 : can't seem to get it right

转载 作者:行者123 更新时间:2023-12-04 12:16:19 25 4
gpt4 key购买 nike

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

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 ,但它适用于类方法(新),它涉及使用元对象协议(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) }

关于functional-programming - 实例化对象的方法语法 : can't seem to get it right,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51463535/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com