oop - Perl 6 多方法从不匹配预期的签名
问题描述
我有一个有两个多方法(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
声明了默认值。
解决方案
多分派分两个阶段工作:
- 考虑位置参数的数量及其类型
- 如果有任何
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>
);
因此 TOXICITY 只是一个Int
,但预期的是一个类型化的MODEL
值数组。
因此,如果您这样做:
multi method submit(Str :$message!, MODEL :@models = Array[MODEL](TOXICITY)) {
它应该工作。
推荐阅读
- terraform - terraform - 创建 AWS Elastic Beanstalk 时出错
- c++ - 提升消息队列未跨两个进程接收
- python - 计算熊猫数据框与基线值相比的百分比变化
- python-3.x - 数据透视表函数不起作用 - AttributeError:“numpy.ndarray”对象没有属性“名称”
- kotlin - withContext 和 suspendCancellableCoroutine 的区别
- html - 如何在边框内居中文本?
- azure - 弹性工作代理应该与 Azure 管理实例数据库一起使用吗?
- python - 有没有办法覆盖 Python 中现有(系统)类的方法?
- pdf - PDF中不可读的阿拉伯字符有什么解决方案吗
- sql - 唯一查询给了我重复的行