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

How do you create a callable variable to call a class method with arguments?

提问人:Jim Bollinger 提问时间:10/22/2023 更新时间:10/22/2023 访问量:216

问:

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

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

这可能吗?

方法 Raku 咖喱可 调用

评论


答:

7赞 codesections 10/22/2023 #1

是的,这是可能的。缺少的部分是方法隐式地接收它们的 invocant 作为它们的第一个位置参数(即 的方法的签名是 really),并作为它们的第一个位置参数接收。Personwalkmethod 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