6

鉴于角色 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;
4

2 回答 2

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;
于 2009-07-20T00:01:07.550 回答
6

请注意,这也有效:

class FooBar with Fooable with Barable {}

这似乎是我在 MooseX::Declare 世界中看到的最常见的用法。

另请注意,您也可以使用“经典”方式:

class FooBar {
    with qw(Fooable Barable);
}

在某些情况下需要这样做,因为这会立即构成角色,而在类行中定义角色会延迟到类块的末尾。

于 2009-07-20T16:27:40.297 回答