@ पटरियों पर रूबी में चर


294

बीच क्या अंतर है @titleऔर title? चूँकि ये दोनों परिवर्तनशील नाम हो सकते हैं। इसके अलावा, मैं यह कैसे तय करूं कि मुझे किस तरह के चर का उपयोग करना चाहिए? के साथ @या नहीं?


मैं कहूंगा कि यह ट्यूटोरियल इन सभी को समझाने के लिए काफी साफ-सुथरा है: techotopia.com/index.php/…
हार्न

जवाबों:


426

titleएक स्थानीय चर है। वे केवल इसके दायरे में मौजूद हैं (वर्तमान ब्लॉक)

@title एक उदाहरण चर है - और कक्षा के भीतर सभी तरीकों के लिए उपलब्ध है।

आप यहाँ और अधिक पढ़ सकते हैं: http://strugglingwithruby.blogspot.dk/2010/03/variables.html

रूबी ऑन रेल्स में - अपने चर को अपने नियंत्रक में उदाहरण चर के रूप में घोषित करना ( @title) उन्हें आपके विचार के लिए उपलब्ध कराता है।


4
उत्तर के लिए धन्यवाद, फॉलो-अप प्रश्न है ... मैं जिस कक्षा में काम कर रहा हूं, उसके भीतर सदस्य चर को शुरू में @options = {{} की तरह बनाया गया है। हालांकि इसके बाद, क्लास एक्सेस के भीतर के तरीके और उस वैरिएबल के साथ फंक्शन कॉल करते हैं जैसे कि वह लोकल हो (यानी "options.merge ()")। क्या यह सिर्फ बुरा रूप है? क्या कुछ अन्य वाक्यात्मक जादू चल रहा है? (यानी वैरिएबल के साइलेंट डुबकी लगाना या इसे 'कास्ट' बनाना ताकि इसे संशोधित नहीं किया जा सके, आदि)। मैं एक C / C ++ और Java परिप्रेक्ष्य से आ रहा हूं, और वास्तव में अस्पष्ट और वैकल्पिक वाक्य रचना मुझे पागल कर रहा है!
डैन डिवाइन

क्या आपकी कक्षा में एक ही नाम @DanDevine के साथ एक attr_accessor परिभाषित है? attr_accessor सिंथैटिक शुगर है जो आपके लिए एक गेट्टर \ सेटर बनाती है। यदि आपको @ चिह्न के बिना मान मिल रहा है तो कोड वैरिएबल प्राप्त करता है क्योंकि यह गेट्टर कह रहा है। ध्यान दें कि यह दूसरे तरीके से काम नहीं करता है, आपको @ चिह्न का स्पष्ट रूप से उपयोग करने की आवश्यकता है यदि आप संस्करण सेट कर रहे हैं या आप बस एक स्थानीय संस्करण सेट करेंगे। क्या यह अच्छी शैली है? बताना कठिन है। मैं अपने तरीके में गेट्टर सिंटैक्स का उपयोग करना पसंद करता हूं, जब गेट को ओवरराइड करने की स्थिति में - मुझे उस एनकैप्सुलेशन का सम्मान करना पसंद है, यहां तक ​​कि कक्षा के भीतर भी। YMMV
Msencenb

30

@titleजब आप चाहते हैं कि आपका चर आपके विचारों में उपलब्ध हो तो अपने नियंत्रकों में उपयोग करें ।

व्याख्या यह है कि @titleएक उदाहरण चर है और titleएक स्थानीय चर है और रेल नियंत्रकों से विचारों के लिए उदाहरण चर उपलब्ध कराता है। ऐसा इसलिए होता है क्योंकि टेम्पलेट कोड (erb, haml, आदि) को वर्तमान नियंत्रक उदाहरण के दायरे में निष्पादित किया जाता है।


इसके लिए धन्यवाद! यह एकमात्र उत्तर है जो बताता है कि क्यों नियंत्रक वर्ग में परिभाषित @ चर को विचारों में कोड द्वारा उठाया जा सकता है।
13

25

अंतर चर के दायरे में है। @Version वर्ग उदाहरण के सभी तरीकों के लिए उपलब्ध है।

संक्षिप्त उत्तर, यदि आप नियंत्रक में हैं और आपको चर को देखने के लिए उपलब्ध कराने की आवश्यकता है तो उपयोग करें @variable

अधिक लंबे उत्तर के लिए यह प्रयास करें: http://www.ruby-doc.org/docs/ProgrammingRuby/html/tut_classes.html


14

@variableमाणिक में s को उदाहरण चर कहा जाता है। जिसका अर्थ है कि आप इन चर को कक्षा के अंदर किसी भी METHOD में एक्सेस कर सकते हैं। [कक्षा में सभी तरीकों के पार]

बिना @चिन्ह वाले चर को स्थानीय चर कहा जाता है, जिसका अर्थ है कि आप इन स्थानीय चर को केवल THAT DECLARED METHOD के भीतर एक्सेस कर सकते हैं। स्थानीय दायरे तक सीमित।

उदाहरण चर के उदाहरण:

class Customer
  def initialize(id, name, addr)
    @cust_id = id
    @cust_name = name
    @cust_addr = addr
  end

  def display_details
    puts "Customer id #{@cust_id}"
    puts "Customer name #{@cust_name}"
    puts "Customer address #{@cust_addr}"
  end
end

ऊपर के उदाहरण में @cust_id, @cust_name, @cust_addrवर्ग के भीतर एक और तरीका में पहुंचा जा सकता है। लेकिन स्थानीय चर के साथ एक ही चीज सुलभ नहीं होगी।


9

चर स्कोप क्या है के बारे में एक ट्यूटोरियल ? कुछ विवरणों को अच्छी तरह से प्रस्तुत करता है, बस संबंधित को यहां संलग्न करें।


+------------------+----------------------+
| Name Begins With |    Variable Scope    |
+------------------+----------------------+
| $                | A global variable    |
| @                | An instance variable |
| [a-z] or _       | A local variable     |
| [A-Z]            | A constant           |
| @@               | A class variable     |
+------------------+----------------------+

4

स्थानीय वैरिएबल केवल इनिशियलाइज़ेशन के ब्लॉक के भीतर से पहुँचा जा सकता है। इसके अलावा एक स्थानीय चर एक निचले मामले पत्र (az) या अंडरस्कोर (_) से शुरू होता है।

और उदाहरण चर का एक उदाहरण है selfऔर @इसके साथ शुरू होता है भी एक उदाहरण चर वस्तु के अंतर्गत आता है। इंस्टेंस वैरिएबल वे हैं जो आप अर्थात .sendआदि पर कार्य करते हैं

उदाहरण:

@user = User.all

@userउदाहरण चर रहा है

और Uninitialized इंस्टेंस चर का मान होता है Nil


तो यह कैसे @titleऔर के बीच अंतर की व्याख्या करता है title?
रिचर्ड पेक

@Title जैसे उदाहरण चर के साथ, आप इस पर विभिन्न विधियाँ कर सकते हैं, जबकि एक स्थानीय चर
जो

1
तो यह कैसे वास्तव में सवाल तय करता है? लगता है कि आप बस कुछ ट्यूटोरियल उद्धृत कर रहे हैं। ओपी पता करने के लिए कि क्या वे का उपयोग करना चाहिए चाहता है @titleयाtitle
रिचर्ड पेक

तो वे एक उदाहरण चर का उपयोग करना चाहिए अगर वे चाहते हैं डीईएफ़ Ie डीईएफ़ नई किसी भी तरीकों करते हैं या करने के लिए बनाने आदि
जो हिल्टन

3
कुछ भी आपको उपयोगकर्ता = User.all करने से रोकता है और उपयोगकर्ता पर विधियों का प्रदर्शन करता है लेकिन यह बात नहीं है।
Jaro

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.