提问人:Jim Bollinger 提问时间:10/22/2023 更新时间:10/22/2023 访问量:216
如何创建一个可调用的变量来调用带有参数的类方法?
How do you create a callable variable to call a class method with arguments?
问:
我正在尝试为类方法创建一个可调用的变量。
class Person {
method walk(Str $direction) {
say "Walking $direction";
}
}
我可以为方法“walk”创建一个可调用的变量,该变量按预期工作。
my $person = Person.new;
my $callable = $person.^find_method('walk');
$person.$callable('up'); # OUTPUT: "Walking up"
现在我想创建一个可调用对象,它将使用参数“up”调用方法“walk”。
my $callable = $person.^find_method('walk').assuming('up');
$person.$callable();
# Type check failed in binding to parameter '$direction'; expected Str but got Person (Person.new)
# in sub __PRIMED_ANON at EVAL_7 line 1
# in block <unit> at <unknown file> line 1
$person.$callable
(不带括号)给出相同的错误
我尝试“直接”调用它,但得到了不同的错误。
$person.^find_method('walk')('up')
# Too few positionals passed; expected 2 arguments but got 1
# in method walk at <unknown file> line 2
# in block <unit> at <unknown file> line 1
这可能吗?
答:
7赞
codesections
10/22/2023
#1
是的,这是可能的。缺少的部分是方法隐式地接收它们的 invocant 作为它们的第一个位置参数(即 的方法的签名是 really),并作为它们的第一个位置参数接收。Person
walk
method walk(Person: Str $direction)
self
这意味着您需要使用 to 提供第二个位置参数,而不是第一个位置参数。这是它的样子:assuming
class Person {
method walk(Str $direction) {
say "Walking $direction";
}
}
my $person = Person.new;
my $callable = $person.^find_method('walk').assuming(*, 'up');
$person.$callable(); # # OUTPUT: "Walking up"
作为另一种选择,您可以使用 ;如果这样做,则无需在 .*
$person
$callable()
"Walking up"
Person
评论