鉴于角色Fooable和Barable都已定义,我怎么说FooBar类可以做Fooable和Barable?我没问题
#!/usr/bin/perl
use MooseX::Declare;
role Fooable {
method foo { print "foo\n" }
}
role Barable {
method bar { print "bar\n" }
}
class Foo with Fooable {}
class Bar with Barable {}
package main;
use strict;
use warnings;
Foo->new->foo;
Bar->new->bar;
但是当我尝试添加
时class FooBar with Fooable, Barable {}
我得到的不是有用的错误
expected option name at [path to MooseX/Declare/Syntax/NamespaceHandling.pm] line 45
为了向自己证明我并不疯狂,我用Moose重写了它。这段代码有效(但比罪恶更难):
#!/usr/bin/perl
package Fooable;
use Moose::Role;
sub foo { print "foo\n" }
package Barable;
use Moose::Role;
sub bar { print "bar\n" }
package Foo;
use Moose;
with "Fooable";
package Bar;
use Moose;
with "Barable";
package FooBar;
use Moose;
with "Fooable", "Barable";
package main;
use strict;
use warnings;
Foo->new->foo;
Bar->new->bar;
FooBar->new->foo;
FooBar->new->bar;
答案 0 :(得分:6)
显然你需要括号:
#!/usr/bin/perl
use MooseX::Declare;
role Fooable {
method foo { print "foo\n" }
}
role Barable {
method bar { print "bar\n" }
}
class Foo with Fooable {}
class Bar with Barable {}
class FooBar with (Fooable, Barable) {}
package main;
use strict;
use warnings;
Foo->new->foo;
Bar->new->bar;
FooBar->new->foo;
FooBar->new->bar;
答案 1 :(得分:6)
请注意,这也有效:
class FooBar with Fooable with Barable {}
这似乎是我在MooseX :: Declare world中看到的最常见的用法。
另请注意,您也可以使用“经典”方式:
class FooBar {
with qw(Fooable Barable);
}
有些情况需要这样做,因为它会立即组成角色,而在类行中定义角色会延迟到类块结束。