我正在制作一个具有多模块文件的模块,并且在不同模块中使用角色时遇到了这个问题.
例如,我们有两个模块Foo和Bar,每个模块都有一个角色.
module Foo {
role foo is export {
}
}
module Bar {
import Foo;
role bar is export does foo {
}
}
import Foo;
import Bar;
sub f(foo \k) { }
f(bar.new);
Run Code Online (Sandbox Code Playgroud)
我认为代码很好,但rakudo说它认为bar不是foo而且拒绝编译.
这有什么不对?
2022 年更新我刚刚检查过,在 v2022.02 中,此代码现在可以按预期工作。
foo后面的符号import不是=:=to Foo::foo,也不接受智能匹配中的后者。这对我来说似乎是一个错误,并且可能与正在发生的事情有关:
module Foo {
role foo is export { }
.say for foo.^name, Foo::foo.^name,
Foo.WHICH, foo.WHICH, Foo::foo.WHICH,
foo.isa(Foo::foo),
Foo::foo.isa(foo),
foo.does(Foo::foo),
Foo::foo.does(foo),
foo ~~ Foo::foo,
Foo::foo ~~ foo,
}
import Foo;
.say for foo.^name, Foo::foo.^name,
Foo.WHICH, foo.WHICH, Foo::foo.WHICH,
foo.isa(Foo::foo),
Foo::foo.isa(foo),
foo.does(Foo::foo),
Foo::foo.does(foo),
foo ~~ Foo::foo,
Foo::foo ~~ foo,
Foo::foo
Foo::foo
Foo|U64545472
Foo::foo|U64545856
Foo::foo|U64545856
False
False
True
True
True
True
Foo::foo
Foo::foo
Foo|U64545472 <^-- all good so far
Foo::foo|U64545616 <--- uhoh
Foo::foo|U64545856
False
False
True
True
True
False <-- presumably a consequence of uhoh
Run Code Online (Sandbox Code Playgroud)
如果没有人比我更早解决并且没有人表明为什么它不是一个错误,我将在接下来的几天内提交一个错误。
这对我来说看起来像是一个错误。一些进一步的调查:
module Foo {
role Bar is export {}
}
module Quux {
import Foo;
constant Barr = Bar;
role Baz does Bar is export {}
role Bazz does Foo::Bar is export {}
}
import Foo;
import Quux;
# these are all the same:
say Foo::EXPORT::ALL::Bar.WHICH;
say Quux::Barr.WHICH;
say Bar.WHICH;
# but different from our original type object!?!
say Foo::Bar.WHICH;
# now it gets weird:
say Baz ~~ Bar; # True
say Baz.new ~~ Bar; # False
say Baz ~~ Foo::Bar; # False
say Baz.new ~~ Foo::Bar; # True
# however, these all 'work':
say Bazz ~~ Bar; # True
say Bazz.new ~~ Bar; # True
say Bazz ~~ Foo::Bar; # True
say Bazz.new ~~ Foo::Bar; # True
Run Code Online (Sandbox Code Playgroud)
目前,似乎最好只从另一个模块角色的完全限定公共版本而不是导出角色中派生新角色:导出似乎创建了一个新类型对象,该对象与智能匹配/类型检查进行奇怪的交互...