2009-07-28 14 views

उत्तर

28

गुण एक वस्तु का विशिष्ट गुण हैं:

class Thing 
    attr_accessor :my_property 

    attr_reader :my_readable_property 

    attr_writer :my_writable_property 

    def do_stuff 
     # does stuff 
    end 
end 

का तरीका यहां बताया वर्ग का उपयोग करेंगे। तरीके किसी ऑब्जेक्ट की क्षमताओं हैं।

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

class Foo 
    def initialize(color) 
    @color = color 
    end 
end 

class Bar 
    def initialize(color) 
    @color = color 
    end 

    def color 
    @color 
    end 
end 

class Baz 
    def initialize(color) 
    @color = color 
    end 

    def color 
    @color 
    end 

    def color=(value) 
    @color = value 
    end 
end 

f = Foo.new("red") 
f.color # NoMethodError: undefined method ‘color’ 

b = Bar.new("red") 
b.color # => "red" 
b.color = "yellow" # NoMethodError: undefined method `color=' 

z = Baz.new("red") 
z.color # => "red" 
z.color = "yellow" 
z.color # => "yellow" 

क्योंकि यह वास्तव में commmon व्यवहार है, रूबी एक्सेसर पद्धतियां निर्धारित करने के कुछ आसान तरीका प्रदान करता है।

+1

आप ऑब्जेक्ट.instance_variable_get (: @ प्रतीक) का उपयोग कर चर का उपयोग कर सकते हैं, जो एक्सेसर्स को परिभाषित करने की आवश्यकता को रोकता है। –

+6

यह वास्तव में एक अच्छा अभ्यास नहीं है। ;) example_variable_get मेटाप्रोग्रामिंग सामग्री के लिए आरक्षित होना चाहिए। यह एक विधि को निजी रूप से परिभाषित करने जैसा है, इसे भेजने (: विधि) के साथ एक्सेस करना। –

38

विशेषताएँ केवल एक शॉर्टकट हैं। यदि आप एक विशेषता बनाने के लिए attr_accessor का उपयोग करते हैं, तो रूबी सिर्फ एक आवृत्ति चर घोषित करता है और आपके लिए गेटर और सेटटर विधियां बनाता है।

जब से तुम एक उदाहरण के लिए पूछा:

# Instantiate 
thing = Thing.new 

# Call the method do_stuff 
thing.do_stuff 

# You can read or write my_property 
thing.my_property = "Whatever" 
puts thing.my_property 

# We only have a readable accessor for my_readable_property 
puts thing.my_readable_property 

# And my_writable_propety has only the writable accessor 
thing.my_writable_property = "Whatever" 
+3

मुझे लगता है कि यह अनुमोदित उत्तर से एक बेहतर जवाब है ... –

4

विशेषताएँ, कक्षा उदाहरण के उदाहरण चर, कड़ाई से बोल रही हैं। अधिक सामान्य शब्दों में, विशेषताओं को आमतौर पर attr_X प्रकार विधियों का उपयोग करके घोषित किया जाता है, जबकि विधियों को बस घोषित किया जाता है।

एक साधारण उदाहरण हो सकता है:

attr_accessor :name 
attr_reader :access_level 

# Method 
def truncate_name! 
    @name = truncated_name 
end 

# Accessor-like method 
def truncated_name 
    @name and @name[0,14] 
end 

# Mutator-like method 
def access_level=(value) 
    @access_level = value && value.to_sym 
end 

भेद इन दोनों के बीच रूबी में हद तक अनियन्त्रित है के बाद से उन्हें कोई सीधी पहुंच विशेष रूप से प्रदान की जाती है। यह सी, या सी ++ और जावा जैसी अन्य भाषाओं के साथ काफी दृढ़ता से विरोध करता है जहां एक ऑब्जेक्ट गुणों और कॉलिंग विधियों का उपयोग दो अलग-अलग तंत्रों के माध्यम से किया जाता है। विशेष रूप से जावा में एक्सेसर/म्यूटेटर विधियां होती हैं जिन्हें इस तरह लिखा जाता है, जबकि रूबी में इन्हें नाम से निहित किया जाता है।

यह अक्सर उदाहरण है, उदाहरण के तौर पर, जहां "विशेषता एक्सेसर" और एक उपयोगिता विधि के बीच का अंतर है जो एक विशेषता के मूल्य के आधार पर डेटा प्रदान करता है, जैसे truncated_name, मामूली है।

1
class MyClass 
    attr_accessor :point 

    def circle 
    return @circle 
    end 

    def circle=(c) 
    @circle = c 
    end 
end 

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

obj = MyClass.new 
obj.point = 3 
puts obj.point 
> 3 

विधि 'सर्कल' @ सर्कल उदाहरण चर के लिए एक स्पष्ट रूप से परिभाषित गेटर है। 'सर्कल =' @circle इंस्टेंस वैरिएबल के लिए एक स्पष्ट रूप से परिभाषित सेटटर है।

0

मैंने रुबी-विशिष्ट सर्कल में, "विशेषता" शब्द को किसी भी विधि से सुना है जो तर्क नहीं लेता है।

class Batman 

    def favorite_ice_cream 
    [ 
     'neopolitan', 
     'chunky monkey', 
     'chocolate', 
     'chocolate chip cookie dough', 
     'whiskey' 
    ].shuffle[0]   
    end 

end 

उपरोक्त में, my_newest_batman.favorite_ice_cream एक विशेषता होगी।

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