首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Perl 6多个方法永远不匹配预期的签名。

Perl 6多个方法永远不匹配预期的签名。
EN

Stack Overflow用户
提问于 2019-06-25 15:46:28
回答 1查看 175关注 0票数 10

我有一个有两个多方法(multi submit)的类。

我这样称呼我的多人:

代码语言:javascript
复制
$perspective.submit(:message($message.content));

它会被送到我的班上:

代码语言:javascript
复制
my $perspective-api = API::Perspective.new(:api-key(%*ENV<PERSPECTIVE_API_KEY>));

proto method submit (|) {*}

multi method submit(Str :$message!, MODEL :@models = TOXICITY) {
    my $score = $perspective-api.analyze(:@models, :comment($message));
    say @models Z=> $score<attributeScores>{@models}.map: *<summaryScore><value>;

multi method submit(Str :$name!, MODEL :@models = TOXICITY) {
    my $score = $perspective-api.analyze(:@models, :comment($name));
    say @models Z=> $score<attributeScores>{@models}.map: *<summaryScore><value>;
}

然而,我总是得到以下响应:

代码语言:javascript
复制
Died because of the exception:
    Cannot resolve caller AUTOGEN(Rose::ContentAnalysis::Perspective:D: :message(Str)); none of these signatures match:
        (Rose::ContentAnalysis::Perspective: Str :$message!, MODEL :@models = MODEL::TOXICITY, *%_)
        (Rose::ContentAnalysis::Perspective: Str :$name!, MODEL :@models = MODEL::TOXICITY, *%_)

尽管我的命名参数(:message)是一个需要的Str,并且@models有一个默认声明。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-06-25 16:01:51

多个调度工作分两个阶段进行:

  • 考虑位置参数的数目及其类型
  • 如果有任何where子句、命名参数或子签名,则执行签名的测试绑定,以确定是否匹配。

如果候选人因任何原因无法约束,第二阶段将拒绝该候选人。其中一个原因,我相信问题的原因,是默认值输入错误。例如,在:

代码语言:javascript
复制
multi m(:@x = "not-an-array") { }
m()

我们得到一个错误:

代码语言:javascript
复制
Cannot resolve caller m(...); none of these signatures match:
    (:@x = "not-an-array")
  in block <unit> at -e line 1

但将其改为:

代码语言:javascript
复制
multi m(:@x = ["an-array"]) { }
m()

效果很好。(请注意,虽然默认值使用=,但它实际上是一个绑定,而不是赋值。)

在这个问题中,有这样一个例子:

代码语言:javascript
复制
MODEL :@models = TOXICITY

查看代码来自的模块源代码,我看到:

代码语言:javascript
复制
enum MODEL is export (
        <TOXICITY SEVERE_TOXICITY TOXICITY_FAST IDENTITY_ATTACK
        INSULT PROFANITY SEXUALLY_EXPLICIT THREAT FLIRTATION
        ATTACK_ON_AUTHOR ATTACK_ON_COMMENTER INCOHERENT INFLAMMATORY
        LIKELY_TO_REJECT OBSCENE SPAM UNSUBSTANTIAL>
);

因此毒性只是一个Int,但所期望的是一个MODEL值的类型化数组。

因此,如果您这样做:

代码语言:javascript
复制
multi method submit(Str :$message!, MODEL :@models = Array[MODEL](TOXICITY)) {

应该管用的。

票数 12
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56757758

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档