क्या आप मुझे एक उदाहरण दे सकते हैं?रुबी में तरीके और विशेषताओं के बीच क्या अंतर है?
उत्तर
गुण एक वस्तु का विशिष्ट गुण हैं:
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 व्यवहार है, रूबी एक्सेसर पद्धतियां निर्धारित करने के कुछ आसान तरीका प्रदान करता है।
विशेषताएँ केवल एक शॉर्टकट हैं। यदि आप एक विशेषता बनाने के लिए 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"
मुझे लगता है कि यह अनुमोदित उत्तर से एक बेहतर जवाब है ... –
विशेषताएँ, कक्षा उदाहरण के उदाहरण चर, कड़ाई से बोल रही हैं। अधिक सामान्य शब्दों में, विशेषताओं को आमतौर पर 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, मामूली है।
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 इंस्टेंस वैरिएबल के लिए एक स्पष्ट रूप से परिभाषित सेटटर है।
मैंने रुबी-विशिष्ट सर्कल में, "विशेषता" शब्द को किसी भी विधि से सुना है जो तर्क नहीं लेता है।
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 एक विशेषता होगी।
- 1. रुबी में स्ट्रिंग और प्रतीक के बीच क्या अंतर है?
- 2. रुबी में URI.escape और URI.encode के बीच क्या अंतर है?
- 3. रुबी - सिंगल और डबल कोट्स के बीच क्या अंतर है?
- 4. रुबी: तुलनात्मकताओं के बीच क्या अंतर है: "||" और "या"
- 5. एक्सएसएलटी विशेषताओं के बीच क्या अंतर है जब
- 6. रुबी में <=> और == के बीच अंतर?
- 7. मानचित्र, प्रत्येक के बीच क्या अंतर है, और एकत्रित करें?
- 8. belong_to और has_one के बीच क्या अंतर है?
- 9. स्क्रिप्ट टैग में "लैंग" और "टाइप" विशेषताओं के बीच क्या अंतर है?
- 10. जेकिल में श्रेणियाँ और टैग के बीच क्या अंतर है?
- 11. # {} $ {} और% {} के बीच क्या अंतर है?
- 12. के बीच क्या अंतर है:। और: आर !?
- 13. [अपरिभाषित] और [,] के बीच क्या अंतर है?
- 14. उद्देश्य-गुणों में संपत्ति विशेषताओं के बीच अंतर-सी
- 15. $ और $$ के बीच क्या अंतर है?
- 16. भिन्नता और '-' के बीच क्या अंतर है?
- 17. "$^एन" और "$ +" के बीच क्या अंतर है?
- 18. वीबी और सी # में घटनाओं के बीच क्या अंतर है?
- 19. रुबी के डुप्लिक और क्लोन विधियों के बीच क्या अंतर है?
- 20. प्रकाशन कार्य पर आइवी के संशोधन और पब्रेविजन विशेषताओं के बीच क्या अंतर है?
- 21. रूबी में एसटीडीआईएन और $ स्टडीन के बीच क्या अंतर है?
- 22. एंड्रॉइड के बीच क्या अंतर है: लेआउट_विड्थ और एंड्रॉइड: चौड़ाई
- 23. रुबी - अंतर: परिवर्तनीय और @ variable
- 24. [AcceptVerbs (HttpVerbs.Post)] और [HttpPost] के बीच क्या अंतर है?
- 25. के बीच क्या अंतर है?
- 26. MATLAB में & &&& के बीच क्या अंतर है?
- 27. अंतर और कहां के बीच क्या अंतर है?
- 28. अंतर विशेषताओं
- 29. मापनीयता और लोच के बीच क्या अंतर है?
- 30. एंड्रॉइड पर GetDir और getFilesDir के बीच क्या अंतर है?
आप ऑब्जेक्ट.instance_variable_get (: @ प्रतीक) का उपयोग कर चर का उपयोग कर सकते हैं, जो एक्सेसर्स को परिभाषित करने की आवश्यकता को रोकता है। –
यह वास्तव में एक अच्छा अभ्यास नहीं है। ;) example_variable_get मेटाप्रोग्रामिंग सामग्री के लिए आरक्षित होना चाहिए। यह एक विधि को निजी रूप से परिभाषित करने जैसा है, इसे भेजने (: विधि) के साथ एक्सेस करना। –