functional-programming - 实例化对象的方法语法:似乎无法正确
问题描述
我想获得一个指向对象方法的指针,例如这个类
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 本身,这意味着对象本身没有进入。
我已经检查了这个答案,但它是一个类方法(新),它涉及使用元对象协议。会有更简单的方法吗?
解决方案
您可以获得“静态”方法.^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) }
推荐阅读
- python-3.x - Selenium 无法正确加载 html - Python3.8
- javascript - 如何将UTC时间戳转换为另一个城市的当前时间?
- python - 在 for 循环中附加列表
- sql - ISNULL() 是否特定于整数?
- php - 如何在 SQL 或 PHP 中计算持续时间日期
- c - 如果修改了目标间接引用的数据,我应该声明指针的目标常量吗?
- dataframe - 如何将长纪元列从火花加载到弹性搜索作为时间格式?
- typescript - 以更 Typescript 的方式解决问题
- java - 如何在 Java 的 GridLayout 中设置特定组件的位置?
- c - 将数字转换为数组中的单词