См. isa-ok
не работает с параметризованными типами .(Я думаю, что название проблемы вводит в заблуждение, потому что aiui на самом деле о классах против ролей, не параметризованных против непараметризованных типов. В конце концов, можно написать Array[Int]
, и это, возможно, параметризованный тип.)
Я нашел это поиск в репо Rakudo Github 'isa-ok' и нажатие на Issues
.
Mu.pm6 определяет isa
:
proto method isa(|) {*}
multi method isa(Mu \SELF: Mu $type --> Bool:D) {
nqp::hllbool(SELF.^isa($type.WHAT))
}
multi method isa(Mu \SELF: Str:D $name --> Bool:D) {
return True if .^name eq $name for SELF.^mro;
False
}
Первый мульти работает только если тип является классом.В P6 слово «isa» имеет техническое значение, которое A isa B
если A
и B
являются классами и A
is, или наследует от B
.
(Более конкретно, isa
класса, который делает Perl6::Metamodel::MROBasedTypeChecking
, разрешается в метод в соответствующем role
, который проверяет совпадение на основе прохождения порядка разрешения метода класса.)
Тип типа Buf
- это роль.(Роли могут быть легко «вставлены» в соответствующие анонимные классы / экземпляры, например, Buf.new
, но это не останавливает Buf
саму роль.)
Тип, подобный Array
, работаетпотому что Array
является классом.
Итак:
put Array.HOW.^name; # Perl6::Metamodel::ClassHOW+{<anon>}
say Array.^mro; # ((Array) (List) (Cool) (Any) (Mu))
isa-ok Array, List; # ok
put Buf.HOW.^name; # Perl6::Metamodel::ParametricRoleGroupHOW
say Buf.^mro; # No such method 'mro' for invocant of type
# 'Perl6::Metamodel::ParametricRoleGroupHOW'
Строковая версия isa-ok
применяется, только если вы передаете строковую версию имени типа.Хорошо это или плохо, но допускает небрежное представление о типах и принимает точное совпадение.
~~
- это «умное сопоставление».Право выбора типа справа - решить, считать ли вещь слева совпадением.
В общем, isa-ok
понимает роли или должен использоваться does-ok
для них?
Нет, это не так.Вы должны использовать does-ok
.