Основная проблема заключается в том, что подмножества на самом деле не являются типами, это просто ограничения.Если вы сделаете
say :(PositiveEven $value).perl;
say :(Positive $value).perl;
say :(Int $value).perl;
, вы получите
:(Int $value where { ... })
:(Int $value where { ... })
:(Int $value)
. Хотя последний явно отличается, два других не имеют различий в отношении подписи, и, таким образом, используется первый найденный.Вам нужно будет либо объявить их как классы, либо найти другой способ дифференцировать их по сигнатуре, либо внутри самой подпрограммы, используя nextsame
proto check($value) { * }
subset PositiveEven of UInt where * %% 2;
multi check(Int $value) {
say "integer"
}
multi check(UInt $value) {
if $value ~~ PositiveEven {
nextsame;
}
say "positive"
}
multi check(PositiveEven $value) {
say "positive & even"
}
Это вернет positive & even
, как и ожидалось.Вам даже не нужно определять аргумент последней подпрограммы как PositiveEven
, но это нормально, чтобы оставить его там для информативных целей.