我有一个有两个多方法(multi submit)的类。
我这样称呼我的多人:
$perspective.submit(:message($message.content));它会被送到我的班上:
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>;
}然而,我总是得到以下响应:
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有一个默认声明。
发布于 2019-06-25 16:01:51
多个调度工作分两个阶段进行:
where子句、命名参数或子签名,则执行签名的测试绑定,以确定是否匹配。如果候选人因任何原因无法约束,第二阶段将拒绝该候选人。其中一个原因,我相信问题的原因,是默认值输入错误。例如,在:
multi m(:@x = "not-an-array") { }
m()我们得到一个错误:
Cannot resolve caller m(...); none of these signatures match:
(:@x = "not-an-array")
in block <unit> at -e line 1但将其改为:
multi m(:@x = ["an-array"]) { }
m()效果很好。(请注意,虽然默认值使用=,但它实际上是一个绑定,而不是赋值。)
在这个问题中,有这样一个例子:
MODEL :@models = TOXICITY查看代码来自的模块源代码,我看到:
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值的类型化数组。
因此,如果您这样做:
multi method submit(Str :$message!, MODEL :@models = Array[MODEL](TOXICITY)) {应该管用的。
https://stackoverflow.com/questions/56757758
复制相似问题