gpt4 book ai didi

signature - 我怎么知道我可以调用具有特定签名的 Perl 6 方法?

转载 作者:行者123 更新时间:2023-12-02 03:03:06 24 4
gpt4 key购买 nike

在 Perl 6 这种多分派(dispatch)语言中,您可以找出是否有与名称匹配的方法。如果存在,您将获得与该名称匹配的 Method 对象列表:

class ParentClass {
multi method foo (Str $s) { ... }
}

class ChildClass is ParentClass {
multi method foo (Int $n) { ... }
multi method foo (Rat $r) { ... }
}

my $object = ChildClass.new;

for $object.can( 'foo' )
.flatmap( *.candidates )
.unique -> $candidate {
put join "\t",
$candidate.package.^name,
$candidate.name,
$candidate.signature.perl;
};


ParentClass foo :(ParentClass $: Str $s, *%_)
ChildClass foo :(ChildClass $: Int $n, *%_)
ChildClass foo :(ChildClass $: Rat $r, *%_)

这很好,但是工作量很大。我宁愿有更简单的东西,例如:

 $object.can( 'foo', $signature );

我可能可以做很多工作来实现这一点,但我是否遗漏了一些已经存在的东西?

最佳答案

当我在那个问题上点击提交时,我有了这个想法,这似乎仍然是太多的工作。 cando方法可以测试 Capture (签名的反面)。我可以 grep 那些匹配的:

class ParentClass {
multi method foo (Str $s) { ... }
}

class ChildClass is ParentClass {
multi method foo (Int $n) { ... }
multi method foo (Rat $r) { ... }
}

my $object = ChildClass.new;

# invocant is the first thing for method captures
my $capture = \( ChildClass, Str );

for $object.can( 'foo' )
.flatmap( *.candidates )
.grep( *.cando: $capture )
-> $candidate {
put join "\t",
$candidate.package.^name,
$candidate.name,
$candidate.signature.perl;
};

不过我不确定我是否喜欢这个答案。

关于signature - 我怎么知道我可以调用具有特定签名的 Perl 6 方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44600619/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com