2016-10-16 7 views
7

मैं कुछ कोड पढ़ रहा था के रूप में मतलब है और मैंक्या + @ रूबी में एक विधि

module M 
    def [email protected] 
    self 
    end 
end 

मुझे आश्चर्य है कि इस कानूनी वाक्य रचना था, फिर भी जब मैं फ़ाइल पर ruby -c भाग गया की तर्ज पर कुछ देखा (लिंट करने के लिए) यह कहा गया कि यह वैध था। [email protected] तब भी एक कानूनी विधि नाम था जब मैंने *@ या [email protected] की कोशिश की, तो वे दोनों अवैध थे। मैं सोच रहा था कि [email protected] का मतलब क्या है और यह कानूनी क्यों है?

उत्तर

12

रूबी +, -, !, ~, & और * सहित कुछ एकल ऑपरेटरों, शामिल हैं। अन्य ऑपरेटरों के साथ आप इन्हें फिर से परिभाषित भी कर सकते हैं। ~ और ! के लिए आप बस def ~ और def ! कह सकते हैं क्योंकि उनके पास बाइनरी समकक्ष नहीं है (उदा। आप a!b नहीं कह सकते हैं)।

- के लिए

हालांकि और + दोनों एक एकल, और एक द्विआधारी संस्करण (उदा a+b और +a दोनों मान्य हैं) है, इसलिए यदि आप एकल संस्करण आप def [email protected] और def [email protected] उपयोग करने के लिए फिर से परिभाषित करना चाहते हैं।

यह भी ध्यान रखें कि * और & का एक यूनरी संस्करण भी है, लेकिन उनके पास विशेष अर्थ हैं। * के लिए यह सरणी को विभाजित करने के लिए जुड़ा हुआ है, और & के लिए यह ऑब्जेक्ट को एक प्रो में परिवर्तित करने के लिए जुड़ा हुआ है, इसलिए यदि आप उनका उपयोग करना चाहते हैं तो आपको क्रमशः to_a और to_proc को फिर से परिभाषित करना होगा।

class SmileyString < String 
    def [email protected] 
    SmileyString.new(self + " :)") 
    end 

    def [email protected] 
    SmileyString.new(self + " :(") 
    end 

    def ~ 
    SmileyString.new(self + " :~") 
    end 

    def ! 
    SmileyString.new(self + " :!") 
    end 

    def to_proc 
    Proc.new { |a| SmileyString.new(self + " " + a) } 
    end 

    def to_a 
    [SmileyString.new(":("), self] 
    end 
end 

a = SmileyString.new("Hello") 
p +a     # => "Hello :)" 
p ~a     # => "Hello :~" 
p *a     # => [":(", "Hello"]  
p !a     # => "Hello :!" 
p +~a    # => "Hello :~ :)" 
p *+!-~a    # => [":(", "Hello :~ :(:! :)"] 
p %w{:) :(}.map &a # => ["Hello :)", "Hello :("] 

अपने उदाहरण में मॉड्यूल बस वस्तु के साथ कुछ नहीं कर रहा, उनका डिफ़ॉल्ट मान के साथ, एक एकल + ऑपरेटर को परिभाषित करता है (:

यहाँ एक और अधिक पूरा एकल ऑपरेटरों के सभी प्रकार दिखा उदाहरण है जो यूनरी प्लस के लिए एक आम व्यवहार है, 5 और +5 आमतौर पर एक ही चीज़ का मतलब है)। किसी भी वर्ग के साथ मिलाकर इसका मतलब यह होगा कि कक्षा को यूनरी प्लस ऑपरेटर का उपयोग करने के लिए तत्काल समर्थन मिलता है, जो कुछ भी नहीं करेगा।

उदाहरण के लिए (माणिक <=2.2 उपयोग करते हुए):

module M 
    def [email protected] 
    self 
    end 
end 

p +"Hello"  # => NoMethodError: undefined method `[email protected]' for "Hello":String 

class String 
    include M 
end 

p +"Hello"  # => "Hello" 

ध्यान दें कि इस उदाहरण में आपको लगता है कि [email protected] विधि वर्ग से लापता है

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

+0

सभ्य स्पष्टीकरण, +1 –

1

विधि के नाम [email protected] और [email protected] एकल ऑपरेटरों + और - रूबी में ओवरलोड उपयोग किया जाता है (1.9+)। यूनरी ऑपरेटर ऑपरेटर हैं जो केवल एक मान लेते हैं (उदा। value = -value)।

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