我有一个使用perl6的subset命令构造的类型层次结构,以及一些专门针对这些类型的多重子。当发生多调度时,如何赋予最窄子类型所专用的子最高的优先级?
这是简化的代码:
#! /usr/bin/env perl6
use v6.c;
proto check($value) { * }
subset Positive of Int where * > 0;
subset PositiveEven of Positive where * %% 2;
multi check(Int $value) {
say "integer"
}
multi check(Positive $value) {
say "positive"
}
multi check(PositiveEven $value) {
say "positive & even"
}
# example:
check(32);
# expected output:
# positive & even
# actual output:
# positive
最佳答案
由于所有候选者都同样严格,因此将采用与其余约束(或缺少约束)匹配的第一个约束。这是在其中指定了多个候选的顺序变得重要的时候。如果您将按以下顺序指定它们:
multi check(PositiveEven $value) { say "positive & even" }
multi check(Positive $value) { say "positive" }
multi check(Int $value) { say "integer" }
以下将满足您的期望:
check(32); # positive & even