2016-08-07 8 views
6

क्या डिफ़ॉल्ट प्रदान करने के लिए किसी भूमिका की विशेषता को ओवरराइड करना संभव है?भूमिका की विशेषता ओवरराइड

role A { 
    has $.a; 
} 
class B does A { 
    has $.a = "default"; 
} 
my $b = B.new; 

यह एक संकलन त्रुटि में परिणाम है:

===SORRY!=== Error while compiling: 
Attribute '$!a' already exists in the class 'B', but a role also wishes to compose it 

उत्तर

5

के बाद से R में तरीकों $!a का उल्लेख कर सकते वहाँ अस्पष्टता क्या विशेषता में जाना जाता है किया जाएगा।

विरासत/मिश्रित विशेषताओं को प्रारंभ करने के लिए सबमिट की गई बोली का उपयोग करें।

role R { has $.a }; 
class C does R { 
    submethod BUILD { $!a = "default" } 
}; 
my $c = C.new; 
dd $c; 
# OUTPUT«C $c = C.new(a => "default")␤» 

आपके उपयोगकेस के आधार पर आप डिफ़ॉल्ट पैरामीटर के माध्यम से डिफ़ॉल्ट सेट करने के लिए बेहतर हो सकते हैं।

role R[$d] { has $.a = $d }; 
class C does R["default"] { }; 
my $c = C.new; 
dd $c; 
# OUTPUT«C $c = C.new(a => "default")␤» 
+2

"चूंकि आर में विधियों का उल्लेख $ हो सकता है! वहां ऐसी अस्पष्टता होगी जो विशेषता को संदर्भित किया जाता है।" क्या यह बात कर रही है कि ओपी का दृष्टिकोण क्यों काम नहीं कर सकता है या किसी ऐसे मुद्दे के बारे में जो आपके पहले समाधान के साथ भी उत्पन्न हो सकता है और जिसे आपके दूसरे समाधान (एक पैरामीट्रिक भूमिका का उपयोग) द्वारा हल किया गया है? – raiph

1

नहीं, यह एक विशेषता redeclare करने के लिए संभव नहीं है - लेकिन आप वर्ग के BUILD submethod का उपयोग कर इसे प्रारंभ कर सकते हैं:

role A { 
    has $.a; 
} 

class B does A { 
    submethod BUILD(:$!a = 'default') {} 
} 

ध्यान दें कि आप सिर्फ BUILD के मुख्य भाग में मूल्य निर्धारित करते हैं के माध्यम से

class B does A { 
    submethod BUILD { $!a = 'default' } 
} 

अपने हस्ताक्षर के स्थान पर उपयोगकर्ता B.new(a => 42) माध्यम से एक नामित प्रारंभकर्ता प्रदान करके डिफ़ॉल्ट अधिलेखित करने में सक्षम नहीं होगा।

role A[$d] { 
    has $.a = $d; 
} 

class B does A['default'] {} 
:

एक और, और अधिक सुरुचिपूर्ण दृष्टिकोण है कि विशेष रूप से उपयोगी है अगर डिफ़ॉल्ट सेटिंग कुछ आप एक बहुत कुछ (यानी डिफ़ॉल्ट मान भूमिका के इंटरफ़ेस के भाग के रूप में माना जा सकता) उम्मीद है कि यह एक पैरामीटर बना रही है

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