我正在尝试为类方法创建一个可调用变量。
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
这可能吗?
是的,这是可能的。缺少的部分是方法隐式接收其调用者作为其第一个位置参数(即,
Person
的 walk
方法的签名实际上是 method walk(Person: Str $direction)
)并接收 self
作为其第一个位置参数。
这意味着您需要使用
assuming
来提供 second 位置参数而不是第一个。看起来是这样的:
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
上调用。