2009-07-19 4 views
6

यह देखते हुए कि भूमिकाएं फ्यूबल और बारबल दोनों को परिभाषित किया गया है, मैं कैसे कहूं कि कक्षा फूबर फ्यूबल और बारबल है? मेरे पास कोईमैं कैसे घोषणा करूं कि एक वर्ग MooseX :: घोषित करने के साथ एक से अधिक भूमिकाओं का उपयोग करता है?

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

बस अपने आप को साबित करने के लिए कि मैं पागल नहीं हूँ, मैं मूस का उपयोग कर इसे फिर से लिखता हूं। इस कोड काम करता है (लेकिन पाप से भद्दा है):

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

उत्तर

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; 
+0

हां, दस्तावेज कहता है 'साथ (@roles) '। एकमात्र प्रश्न सूची में शब्दकोष के बारे में होता। –

+0

आप किस दस्तावेज़ का उपयोग कर रहे हैं? MooseX :: डॉक्स घोषित करें 'भूमिका के साथ कक्षा फू {...} '। मूस डॉक्स कहते हैं, '(@roles)' के साथ, लेकिन फिर सभी उदाहरण 'ब्रेक करने योग्य' के साथ हैं; ' –

6

बस ध्यान दें कि यह भी काम करता है:

class FooBar with Fooable with Barable {} 

यह सबसे सामान्य लगता है मूसएक्स :: मैंने दुनिया में घोषणा की है।

यह भी ध्यान रखें कि आप "क्लासिक" जिस तरह से भी उपयोग कर सकते हैं:

class FooBar { 
    with qw(Fooable Barable); 
} 

ऐसे मामले इस वजह से इस भूमिका तैयार करता वर्ग लाइन में भूमिका को परिभाषित करने के अंत तक देरी हो जाता है तुरंत जबकि आवश्यकता होती है कक्षा ब्लॉक

संबंधित मुद्दे

 संबंधित मुद्दे