如何创建一个可调用的变量来调用带有参数的类方法?

8
我正在尝试为类方法创建一个可调用的变量。
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"

现在我想创建一个可调用的函数,它将调用方法'walk'并传递参数'up'。
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

这可行吗?
1个回答

7
是的,这是可能的。缺失的部分是方法隐式地将其调用者作为第一个位置参数接收(也就是说,Personwalk方法的签名实际上是method walk(Person: Str $direction)),并将self作为它们的第一个位置参数接收。
这意味着你需要使用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上调用它。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接