2010-03-04 15 views
15

में अतिरिक्त तर्क लेते हुए एक सेटर विधि बनाना, मैं एक विधि लिखने की कोशिश कर रहा हूं जो एक सेटटर के रूप में कार्य करता है और असाइन किए गए मान के अलावा कुछ अतिरिक्त तर्क लेता है। बेवकूफ उदाहरण:रूबी

class WordGenerator 
    def []=(letter, position, allowed) 
    puts "#{letter}#{allowed ? ' now' : ' no longer'} allowed at #{position}" 
    end 

    def allow=(letter, position, allowed) 
    # ... 
    end 
end 

एक इंडेक्सर काम करता है के रूप में यह लेखन और मैं इसे इस तरह कॉल कर सकते हैं:

gen = WordGenerator.new 

gen['a', 1] = true 
# or explicitly: 
gen.[]=('a', 1, true) 

लेकिन जब मैं निम्न में से कोई कोशिश, दुभाषिया शिकायत:

gen.allow('a', 1) = false # syntax error 
gen.allow=('a', 1, false) # syntax error 

यह काम क्यों नहीं करेगा, क्या मुझे स्पष्ट याद आ रही है?

+0

संबंधित/डुप्लिकेट: http://stackoverflow.com/questions/9280623/setter-method-assignment-with-multiple-arguments – kotique

उत्तर

16

यह काम नहीं करता है क्योंकि पार्सर इसे अनुमति नहीं देता है। फॉर्म identifier = expression, expression.identifier = expression (जहां पहचानकर्ता \w+), expression[arguments] = expression और expression.[]= arguments और स्ट्रिंग या प्रतीक या वर्ण शाब्दिक (?=) के हिस्से के रूप में एक बराबर चिह्न की अनुमति है। बस।

gen.send(:allow=, 'a', 1, false) काम करेगा, लेकिन उस समय आप विधि को एक नाम दे सकते हैं जिसमें = शामिल नहीं है।

+0

धन्यवाद। मजेदार बात यह है कि यह 'def seed = (value) end जैसे सामान की अनुमति देती है; gen.seed = (1) '। मैं 'बीज =' पहचानकर्ता होने की उम्मीद करता, लेकिन (यदि मैं आपके नियमों को सही ढंग से समझता हूं) यह इस प्रकार है: [जीन/एक्सप्रप्र]। [बीज/पहचानकर्ता] = [(1)/expr]। यह समझाएगा कि यह एक से अधिक तर्कों में क्यों विफल रहता है - (ए) एक अभिव्यक्ति है, हालांकि (ए, बी) नहीं है! यह मानते हुए, 'gen। [] = (' A ', 1, true)' कैसे काम करता है? –

+0

'। [] =' एक और विशेष मामला है जिसे मैं उपरोक्त सूची में भूल गया (अभिव्यक्ति [comma_seperated_expressions] = अभिव्यक्ति 'के साथ, जो निश्चित रूप से भी काम करता है)। – sepp2k

6

मैं इस पर आया हूं और मेरे तर्कों को एक सरणी या हैश के रूप में पास करने का फैसला किया है।

उदा .:

def allow=(arguments) 
    puts arguments[:letter] 
    puts arguments[:position] 
    puts arguments[:allowed] 
end 

object.allow={:letter=>'A',:position=>3,:allowed=>true}