假设有一个A::非常::浅:: ClassA和A::非常:: Deep::ClassB
文件:./A/非常/浅/ClassA.pm6
class A::Very::Shallow::ClassA{
has Str $.label is rw;
has Str $.icon is rw;
has @.items is rw;
}
我想从ClassB中的ClassA继承,所以我写:
文件:./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!)
...
我发现了大量有关继承的文档和示例,但似乎都没有涵盖我认为简单的基本问题。我知道答案可能很明显,但此刻我想不起来了。
当这些类与in处于同一包中时会发生什么
A::Money::Card is A::Money::Item
我现在有点困惑,所以任何指针都很棒。先感谢您。
最佳答案
该类的{
开头之前缺少空格。更改为此:
class A::Very::Deep::ClassB is A::Very::Shallow::ClassA {
}
应该可以正常工作(假设
use
有A::Very::Shallow::ClassA
语句)。当然,知道为什么这个空间很重要也很有趣。
is
语法只是更为通用的特征语法的一种情况。使用特征时,可以将额外的参数与特征名称一起传递。最常见的形式可能是在使用导出标记is export(:util)
时。但是,也可以传递数组(is foo[1, 2, 3]
),引号(is bar<x y z>
)或哈希(is baz{ a => 1, b => 2 }
)。 (此外:实际上,这是一组在冒号对语法中起作用的东西,因此可以将命名参数:foo([1, 2, 3])
改为:foo[1, 2, 3]
);因此,
is Something{}
将您希望的类主体作为空Hash
参数传递给trait。特征只是一个多调度sub
,没有匹配的候选者,这解释了错误和调度失败中对Hash
的提及。