实例化对象的方法的语法:似乎无法正确理解
Syntax of the method of an instantiated object: can't seem to get it right
我想得到一个指向对象方法的指针,例如这个class
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本身,这意味着对象本身没有进入。
我有 ,但它用于 class 方法(新),它涉及使用元对象协议。有更简单的方法吗?
您可以使用 .^lookup
获取 "static" 方法(^
表示它是对元对象的调用)。
该方法未以任何方式绑定到调用者 $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) }
我想得到一个指向对象方法的指针,例如这个class
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
获取 "static" 方法(^
表示它是对元对象的调用)。
该方法未以任何方式绑定到调用者 $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) }