2009-07-07 8 views
21

मैंने कक्षाओं और इंटरफेस का एक सेट लिखा है जो भूमिकाओं का उपयोग करके Moose में लागू किए गए हैं। मुझे समझ में परेशानी हो रही है जो मूस गुण बनाम भूमिकाओं के उपयोग और कार्यान्वयन दोनों में सटीक अंतर है।मूस में भूमिकाएं और लक्षण कैसे भिन्न होते हैं?

Moose documentation कहता है:

यह समझना महत्वपूर्ण है कि भूमिकाओं और लक्षण एक ही बात कर रहे हैं महत्वपूर्ण है। एक विशेषता के रूप में एक भूमिका का उपयोग किया जा सकता है, और एक विशेषता एक भूमिका है। दोनों चीजों को अलग करने वाली एकमात्र चीज यह है कि एक विशेषता इस तरह से पैक की जाती है जो मूस को कक्षा के नाम पर संक्षिप्त नाम हल करने देता है। दूसरे शब्दों में, एक विशेषता के साथ, कॉलर इसे "बिग" जैसे संक्षिप्त नाम से संदर्भित कर सकता है, और मूस इसे MooseX :: Embiggen :: मेटा :: विशेषता :: भूमिका :: बिग जैसी कक्षा में हल कर देगा।

यह मेरी समझ है कि लक्षण और भूमिकाएं "समान" हैं। हालांकि, use Moose -traits 'Foo' सिंटैक्स का उपयोग करके विचार के मूल परीक्षण को लागू करने पर मुझे लगता है कि मैं क्या अपेक्षा करता हूं। निश्चित रूप से मुझे यहां कुछ याद आना चाहिए।

यह पहला उदाहरण के साथ विफल रहता है "वस्तु विधि पता नहीं लगा सकता 'foo'"

package MyApp::Meta::Class::Trait::HasTable; 
use Moose::Role; 
sub foo { warn 'foo' } 

package Moose::Meta::Class::Custom::Trait::HasTable; 
sub register_implementation { 'MyApp::Meta::Class::Trait::HasTable' } 

package MyApp::User; 
use Moose -traits => 'HasTable'; 
__PACKAGE__->foo(); #Can't locate object method 'foo' 

इस एक की तुलना में (जो काम करता है):

package MyApp::Meta::Class::Trait::HasTable; 
use Moose::Role; 
sub foo { warn 'foo' } 

package Moose::Meta::Class::Custom::Trait::HasTable; 
sub register_implementation { 'MyApp::Meta::Class::Trait::HasTable' } 

package MyApp::User; 
use Moose; 
with 'MyApp::Meta::Class::Trait::HasTable'; 
__PACKAGE__->foo(); #foo 

उत्तर

12

यह एकमात्र अंतर है कि कैसे मूस "ट्राइट" और "रोल" शब्द का उपयोग करता है। मूस के प्रलेखन और एपीआई अक्सर "लक्षण" शब्द का उपयोग करते हैं, "भूमिकाएं मेटाक्लास पर लागू होती हैं"। आपके संशोधित उत्तर में आपका पहला उदाहरण MyApp::User के मेटाक्लास को -traits के माध्यम से भूमिका लागू करता है, दूसरा उदाहरण इसे कक्षा पर लागू करता है।

आप के लिए अपना पहला उदाहरण को बदलते हैं:

package MyApp::Meta::Class::Trait::HasTable; 
use Moose::Role; 
sub foo { warn 'foo' } 

package Moose::Meta::Class::Custom::Trait::HasTable; 
sub register_implementation { 'MyApp::Meta::Class::Trait::HasTable' } 

package MyApp::User; 
use Moose -traits => 'HasTable'; 
__PACKAGE__->meta->foo(); 

आप "foo at [script]. line 3." दिखाई देगा कौन सा है कि वास्तव में क्या यह करने वाले कर रहा।

अद्यतन: स्पष्ट रूप से मैं बिल्कुल सही नहीं हूं। लक्षणों पर भूमिकाएं लागू होती हैं। -traits हुक MyApp :: उपयोगकर्ता के लिए मेटाक्लास उदाहरण में हैसटेबल लागू होता है। मैंने प्रासंगिक मूस दस्तावेज़ों को अद्यतन किया है।

+0

धन्यवाद, जो मैं देख रहा था व्यवहार बताता है। – Danny

+1

मैंने इस अंतर को थोड़ा सा प्रतिबिंबित करने के लिए विस्तार/पकाने की विधि 1.pod में पाठ को अद्यतन किया है। चीजों को भ्रमित करने के लिए भी ध्यान दें, रोल-जैसी चीजों को स्कैला जैसी अन्य भाषाओं में लक्षण कहा जाता है। इन लक्षणों को कुछ कागजात में परिभाषित किया गया है जो मूस की भूमिका कार्यान्वयन की उत्पत्ति को सूचित करते हैं लेकिन राज्यों को ले जाने वाली सुविधाओं की कमी (यानी वे केवल विधियां हैं और उनके पास कोई विशेषता नहीं है)। – perigrin

0

आप एक परिभाषित नहीं करते किसी भी भूमिका के साथ पैकेज 'एक्स :: फू'। documentation से सीधे फट, हम देखते हैं कि register_implementation रिटर्न एक वास्तव में परिभाषित पैकेज का नाम:

package MyApp::Meta::Class::Trait::HasTable; 
use Moose::Role; 

has table => (
    is => 'rw', 
    isa => 'Str', 
); 

package Moose::Meta::Class::Custom::Trait::HasTable; 
sub register_implementation { 'MyApp::Meta::Class::Trait::HasTable' } 

package MyApp::User; 
use Moose -traits => 'HasTable'; 

__PACKAGE__->meta->table('User'); 

"शॉर्टकट" मूस "Moose::Meta::Class::Trait::$trait_name" (जब एक "वर्ग संदर्भ" में कहा जाता है) की तलाश द्वारा हासिल की है, न सिर्फ एक छोटा नाम वापस गुजर रहा है।

+0

कृपया मेरे प्रश्न में मेरा संशोधन देखें, मैंने और विस्तार जोड़ने की कोशिश की है। – Danny

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