Наследование классов Perl6, когда классы находятся в разных «пространствах / пакетах имен» - PullRequest
0 голосов
/ 01 ноября 2018

Допустим, у каждого есть A :: Very :: Shallow :: ClassA и A :: Very :: Deep :: ClassB

Файл: ./A/Very/Shallow/ClassA.pm6

class A::Very::Shallow::ClassA{
   has Str $.label is rw;
   has Str $.icon is rw;
   has @.items is rw;
}

Я хочу наследовать от ClassA в ClassB, поэтому я пишу:

Файл: ./A/Very/Deep/ClassB.pm6

class A::Very::Deep::ClassB is A::Very::Shallow::ClassA{
...
}

Тем не менее, ошибки с:

Cannot resolve caller trait_mod:<is>(A::Very::Deep::ClassB, A::Very::Shallow::ClassA, Hash); none of these signatures match:
    (Mu:U $child, Mu:U $parent)
    (Mu:U $child, :$DEPRECATED!)
    (Mu:U $type, :$rw!)
    (Mu:U $type, :$nativesize!)
    (Mu:U $type, :$ctype!)
    (Mu:U $type, :$unsigned!)
    (Mu:U $type, :$hidden!)
    (Mu:U $type, Mu :$array_type!)
    (Mu:U $type, *%fail)
    (Attribute:D $attr, |c is raw)
    (Attribute:D $attr, :$rw!)
    (Attribute:D $attr, :$readonly!)
    (Attribute $attr, :$required!)
    (Attribute $attr, Mu :$default!)
    (Attribute:D $attr, :$box_target!)
...

Я нашел много документации и примеров по наследованию, но ни одна из них, кажется, не охватывает то, что я считаю простой существенной проблемой. Я знаю, что ответ может быть очевидным, но в данный момент мне его не хватает.

Что происходит, когда классы находятся в том же пакете, что и в

A::Money::Card is A::Money::Item

В данный момент я немного озадачен, поэтому любые указатели были бы великолепны. Заранее спасибо.

1 Ответ

0 голосов
/ 01 ноября 2018

Это пробел перед открытием { класса. Меняем это на:

class A::Very::Deep::ClassB is A::Very::Shallow::ClassA {
}

Должно работать нормально (при условии, что для A::Very::Shallow::ClassA есть оператор use).

Конечно, также интересно узнать , почему это пространство имеет значение.

Синтаксис is является лишь одним из примеров гораздо более общего синтаксиса черты. С чертами, разрешено передавать дополнительные аргументы вместе с именем черты. Наиболее часто встречающаяся форма, вероятно, при использовании тегов экспорта: is export(:util). Однако также можно передать массив (is foo[1, 2, 3]), слова в кавычках (is bar<x y z>) или хеш (is baz{ a => 1, b => 2 }). (Помимо: это, по сути, тот же набор вещей, которые работают в синтаксисе colonpair, поэтому вместо именованного параметра :foo([1, 2, 3]) можно записать :foo[1, 2, 3]);

Следовательно, is Something{} передает то, что, как вы надеялись, будет телом класса, в качестве пустого Hash аргумента для черты. Черта - это просто мультидиспетчерская sub, и нет подходящего кандидата, который объясняет упоминание Hash в сообщении об ошибке и сбое отправки.

...