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 を使って書き直しました。このコードは機能します (しかし、sin よりは醜いです):

#!/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

これも機能することに注意してください。

class FooBar with Fooable with Barable {}

これは、MooseX::Declareの世界で見た中で最も一般的な使用法のようです。

また、「クラシック」な方法も使用できることに注意してください。

class FooBar {
    with qw(Fooable Barable);
}

これが役割をすぐに構成するのに対し、クラス行での役割の定義はクラスブロックの終わりまで遅れるため、これが必要になる場合があります。

于 2009-07-20T16:27:40.297 に答える
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 に答える