2011-03-22 7 views
49

मैंने इसे एक स्क्रीनकास्ट में देखा और यह सोच रहा था कि इस मामले में '=' ​​प्रतीक क्या करता है।विधि परिभाषा में विधि नाम के बाद बराबर ('=') प्रतीक क्या करता है?

def express_token=(token) 
... 
end 

मुझे समझ में होगा अगर यह कुछ इस तरह था -

def express_token(token = nil) 

ऊपर (दूसरा कोड स्निपेट) का अर्थ है टोकन पैरामीटर का डिफ़ॉल्ट मान के रूप में नहीं के बराबर की स्थापना। हालांकि, पहले कोड स्निपेट में, '=' ब्रैकेट के बाहर है।

अग्रिम धन्यवाद।

उत्तर

66

कि झलकी को परिभाषित करता है एक Virtual Attribute (या एक "सेटर" विधि) ताकि "express_token" एक विशेषता की तरह दिखता हो, भले ही यह विधि का नाम हो। उदाहरण के लिए:

वस्तु "f" कोई विशेषता या उदाहरण चर "foo" (और न ही यह एक जरूरत है) का नाम दिया है, इसलिए है
class Foo 
    def foo=(x) 
    puts "OK: x=#{x}" 
    end 
end 
f = Foo.new 
f.foo = 123 # => 123 
# OK: x=123 

ध्यान दें कि "foo =" विधि बस वाक्यात्मक चीनी एक विधि अनुमति देने के लिए है कॉल जो एक असाइनमेंट की तरह दिखता है। ध्यान दें कि इस तरह के सेटर विधियों हमेशा किसी भी return कथन या अंतिम मान के बावजूद, उनके तर्क को वापस कर दें।

यदि आप शीर्ष-स्तरीय सेटर विधि को परिभाषित कर रहे हैं, उदाहरण के लिए, "irb" में, तो व्यवहार ऑब्जेक्ट क्लास के तरीकों के अंतर्निहित जोड़ के कारण थोड़ा उलझन में हो सकता है। उदाहरण के लिए:

class NewDog 
    def initialize(breed) 
    @breed = breed 
    end 

    # create reader only 
    attr_reader :breed, :name 

    # setter method 
    def set_name(nm) 
    @name = nm 
    end 
end 

nd = NewDog.new('Doberman') 
nd.set_name('Benzy') 
puts nd.name 

आप इस के लिए सेटर विधि refactor हैं:

def bar=(y) 
    puts "OK: y=#{y}" 
end 
bar = 123 # => 123, sets the variable "bar". 
bar # => 123 
Object.new.bar = 123 # => 123, calls our method 
# OK: y=123 
Object.public_methods.grep /bar/ # => ["bar="] 
+0

आप इस तरह सेटर तरीकों परिभाषित करने के बारे रूबी की आधिकारिक दस्तावेज का उल्लेख कर सकते? – gardenofwine

+0

@gardenofwine: हम्म, अच्छा सवाल, मुझे यकीन नहीं है कि यह विशेष रूप से कहीं भी दस्तावेज किया गया है ... – maerics

+5

इस तथ्य पर +1 कि सेटर विधियां आखिरी कथन, या स्पष्ट वापसी मानों के INSTEAD को अपने तर्क वापस निष्पादित करती हैं। मैंने बस इस idiosyncrasy पर 20 मिनट बर्बाद कर दिया, और इस SO जवाब ने इसे दबाया। –

3

यह वास्तव में फ़ंक्शन के नाम का हिस्सा है। इसलिए यह एक सेटटर है, अगर आपको गेटर्स और सेटर्स के लिए डिफ़ॉल्ट से अलग कार्यक्षमता की आवश्यकता होती है।

18

इन तरीकों में आप सेट उदाहरण एक और अधिक अप्रत्यक्ष तरीके से वार्स करते हैं: कल्पना करें कि आप एक वर्ग Person

class Person < ActiveRecord::Base 
    attr_accessible :first_name, :last_name 

    def full_name 
    [@first_name, @last_name].join 
    end 

    def full_name=(name) 
    @first_name, @last_name = name.split(" ") 
    end 
end 

तो फिर तुम कुछ इस तरह कर सकते हैं:

p = Person.new 
p.full_name = "John Doe" 
p.first_name # => "John" 
p.last_name # => "Doe" 
p.full_name # => "John Doe" 
1

के निम्नलिखित उदाहरण पर एक नज़र डालते हैं

def name=(nm) 
    @name = nm 
end 

अन्य प्रोग्रामर पता है कि नाम = विधि एक सेटर विधि के रूप में व्यवहार करता है। साथ ही @merics द्वारा दिखाए गए यह वर्चुअल विशेषता की तरह व्यवहार करता है।

परिणाम इस प्रकार है:

class NewDog 
    def initialize(breed) 
    @breed = breed 
    end 

    # create reader only 
    attr_reader :breed, :name 

    # setter method 
    def name=(nm) 
    @name = nm 
    end 
end 

nd = NewDog.new('Doberman') 
nd.name = 'Benzy' 
puts nd.name 
संबंधित मुद्दे