2012-01-05 17 views
42

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

class Human 
    def noise=(noise) 
    @noise = noise 
    end 

    def noise 
    @noise 
    end 
end 

इस से, वर्ग instantiated है, और मैं इस डालता कर सकते हैं:

man = Human.new 
man.noise=("Howdie!") 
puts man.noise 

यह Howdie!

अब में जो परिणाम क्या मुझे confuses कि प्रशिक्षक है गेटटर विधि (दो तरीकों में से 2) के बिना कह रहा है, आवृत्ति चर @noise के साथ बातचीत करने का कोई तरीका नहीं है।

class Human 
    def noise=(noise) 
    @noise = noise 
    end 
end 

man = Human.new 
puts man.noise=("Howdie!") 

इस रूप में जब गेटर विधि में इसका इस्तेमाल किया एक ही काम करता है:

लेकिन जब मैं गेटर विधि निकालने के लिए, मैं अभी भी @noise उपयोग करने में सक्षम हूँ, उदाहरण देखें।

तो अब मैं उलझन में हूं। गेटर की आवश्यकता क्यों है? इसके बिना इंस्टेंस वैरिएबल तक पहुंचने में सक्षम नहीं होने के कारण प्रशिक्षक का क्या अर्थ है? क्या यह संभव है कि वह रूबी के पुराने संस्करण का उपयोग कर रहा है?

आपकी मदद के लिए अग्रिम धन्यवाद।

+0

क्या आप वास्तव में @noise तक पहुंचने में सक्षम हैं, या आप जो फ़ंक्शन कॉल कर रहे हैं उसका दुष्प्रभाव देख रहे हैं ... – LVB

उत्तर

31

आप, कि उदाहरण से संबंधित अन्य तरीकों से कि उदाहरण चर के साथ बातचीत कर सकते हैं कोई गेटर है, भले ही:

def noise=(noise) 
    @noise = noise 
end 

def last_noise 
    @noise 
end 

वहाँ एक गेटर पद्धति के रूप में उसी नाम से परिभाषित होने की जरूरत नहीं है ; दोनों बिल्कुल जुड़े नहीं हैं। आवृत्ति चर के मान को "प्राप्त करने" के लिए गेटर की आवश्यकता होती है, लेकिन केवल लघु वाक्यविन्यास में।

क्या अपने उदाहरण में हो रहा है कि आप एक नया वस्तु (Human.new) आरंभ कर रहे हैं, और फिर एक विधि (noise=, हाँ विधि नाम = प्रतीक होता है) कि एक उदाहरण चर को परिभाषित करने के लिए बस इतना-क्या होता है उपयोग कर रहा है (यानी, उस आवृत्ति के लिए एक चर बस), और उसके बाद अंततः विधि कॉल के साथ उस आवृत्ति चर को पुनर्प्राप्त कर रहा है।

आप वास्तव में सब पर परिभाषित करने किसी भी गेटर बिना उदाहरण चर पाने के लिए instance_variable_get उपयोग कर सकते हैं:

man = Human.new 
man.noise = "Howdie" 
man.instance_variable_get("@noise") 

यह "howdie" वापस आ जाएगी, भले ही कोई गेटर परिभाषित होती है।

और नहीं, मुझे नहीं लगता कि वह रूबी के पुराने संस्करण का उपयोग कर रहा है।

+2

+1 रयान। हमेशा की तरह आपकी विशेषज्ञता उत्कृष्ट होती है और मुझे example_variable_get के बारे में पता नहीं था! –

+0

हे जो attr_protected से अधिक सवारी नहीं करता है? –

+0

ने अपना खुद का प्रश्न उत्तर दिया: - एपीआई का कहना है "इस मैक्रो में नामित गुणों को बड़े पैमाने पर असाइनमेंट से संरक्षित किया गया है" –

14

कोड

puts man.noise=("Howdie!") 

, गेटर विधि का उपयोग नहीं करता है तो गेटर विधि यह काम करने के लिए परिभाषित करने की जरूरत नहीं है की लाइन। वह पंक्ति बस सेटर विधि का उपयोग करती है। सेटर विधि का रिटर्न वैल्यू बराबर चिह्न के दाईं ओर जो कुछ भी है, उसके बराबर स्वचालित रूप से बराबर होता है, इसलिए "हाउडी!" puts पर पारित हो जाता है।

कोड

puts man.noise 

की लाइन करता गेटर विधि का उपयोग करें, और यदि आप गेटर विधि निकालने यह काम नहीं होगा।

+0

तो मुझे लगता है कि मेरा प्रश्न है, गेटर और सेटर विधियों का उपयोग क्यों करें? क्यों न केवल सेटटर विधि (या मूल विधि जो मुझे विधि के लिए मूल्य पास करने देती है) का उपयोग न करें और उस पर "वापसी" करें? मैं चीजों को करने का बेहतर तरीका सुझा रहा हूं, मैं सचमुच पूछ रहा हूं क्यों? मुझे समझ में नहीं आता – Nathan

+1

आपको गेटर विधि की आवश्यकता है क्योंकि कभी-कभी आप इसे बदलने के बिना चर का मान प्राप्त करना चाहते हैं। सेटर विधि हमेशा मान को कुछ सेट करती है, इसलिए इसे संशोधित किए बिना मूल्य प्राप्त करने के लिए सेटटर विधि का उपयोग करना असंभव है! –

+0

यदि आप कक्षा के बाहर विधियों द्वारा चर को पठनीय करना चाहते हैं तो आपको केवल गेटटर विधि की आवश्यकता है। यदि आप कक्षा में किसी विधि से चर को पढ़ना चाहते हैं, तो आप गेटर विधि के बजाय बस '@ शोर' का उपयोग कर सकते हैं। –

5

निश्चित रूप से वे दोनों एक मूल्य वापस करते हैं, लेकिन उनका व्यवहार अलग है।

मान लें कि पहले से ही सदस्य @a है।

गेटटर के साथ,का वर्तमान मान प्राप्त करने के बिना, इसे संशोधित किए बिना प्राप्त करता है।

सेटर के साथ, एक @a संशोधित करता है, और वापसी मूल्य के रूप में अपना नया मान प्राप्त करता है।

जब सेटर के व्यवहार के बारे में सोच, ध्यान दें:

  1. @a के पुराने मूल्य सेटर के साथ प्राप्त नहीं किया जा सकता है, और ओवरराइट कर ली।

  2. सेटटर द्वारा लौटाया गया, वास्तव में पहले से ही सेटटर का आह्वान करने से पहले जाना जाता है।

+0

मैं आपके उत्तर को तब तक समझ नहीं पाया जब तक कि मैं हर किसी के पढ़ने को नहीं पढ़ता , अब मैंने किया (और थोड़ा और सोचा), मुझे लगता है कि आपका जवाब घर पर सवाल उठाने में मदद करता है। यदि आप अपना जवाब बढ़ाते हैं तो यह मेरे जैसे नए लोगों की जरूरतों को पहले हर किसी के जवाब पढ़ने के लिए कम कर देता है, तो मैं आपका चयन करना चाहता हूं। – Nathan

+0

खुशी हुई इससे मदद मिली;) – Jokester

1

गेटर्स और सेटर्स के लिए ध्यान हो सकता है क्योंकि कुछ अन्य भाषाएं आपको कक्षा चर का उपयोग करने की अनुमति देती हैं। अजगर:

class k: 
    i = 100 

print k.i # 100 
k.i = 200 
print k.i # 200 

इसके विपरीत, रूबी के वैरिएबल पूरी तरह से वर्ग के लिए निजी के सभी रहता है और केवल एक्सेसर तरीकों के माध्यम से उन्हें उजागर करता है।

अपने उदाहरण में, यदि आप गेटटर को हटाते हैं, तो आप वास्तव में चर के साथ बातचीत कर सकते हैं (यानी: इसे बदलें) सेटर को गले लगाओ, लेकिन जब आप इसकी आवश्यकता हो तो इसे वापस नहीं ले सकते (नियमित रूप से) ।

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