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

问题描述 投票:0回答:1

我正在尝试为类方法创建一个可调用变量。

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

这可能吗?

methods raku currying callable
1个回答
0
投票

是的,这是可能的。缺少的部分是方法隐式接收其调用者作为其第一个位置参数(即,

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
上调用。

© www.soinside.com 2019 - 2024. All rights reserved.