2010-08-21 10 views
9

मैं इन पटरियों की मूल बातें पता कर रहे हैं, लेकिन मैं अभी भी = संकेत और => और रेल में @some_variable, @@some_variable और :some_variable के बीच अंतर के बीच पूर्ण अंतर पता नहीं है।रूबी में "=" और "=>" और "@variable", "@@ variable" और ": variable" के बीच क्या अंतर है?

धन्यवाद।

उत्तर

18

ठीक से दोहराया जा सकता है।

= और => ऑपरेटरों के बीच का अंतर यह है कि पहला असाइनमेंट है, दूसरा हैश (एसोसिएटिव सरणी) में एक एसोसिएशन का प्रतिनिधित्व करता है। तो { :key => 'val' } कह रहा है ":key कुंजी होने के साथ, और 'val' मान होने के साथ एक सहयोगी सरणी बनाएं"। यदि आप रूबीस्ट की तरह आवाज करना चाहते हैं, तो हम इसे "हैशरकेट" कहते हैं। (मान लीजिए या नहीं, यह रूबी में सबसे अजीब ऑपरेटर नहीं है; हमारे पास <=>, या "स्पेसशिप ऑपरेटर" भी है।)

आप भ्रमित हो सकते हैं क्योंकि इसमें एक शॉर्टकट है जिसका आप उपयोग कर सकते हैं विधियों, यदि अंतिम पैरामीटर हैश है, तो आप squiggly ब्रैकेट ({}) को छोड़ सकते हैं। तो render :partial => 'foo' को कॉल करना मूल रूप से रेंडर विधि को कॉल कर रहा है, एक हैश में एक कुंजी/मूल्य जोड़ी के साथ गुजर रहा है। इस वजह से, आप अक्सर एक हैश को अंतिम पैरामीटर के रूप में देखते हैं, जिसमें एक गरीब व्यक्ति के वैकल्पिक पैरामीटर होते हैं (आप जावास्क्रिप्ट में भी ऐसा कुछ देखते हैं)।

रूबी में, कोई सामान्य शब्द स्थानीय चर होता है। इसलिए foo एक विधि के अंदर विधि चर के लिए एक चर है। @ के साथ एक चर का उपसर्ग करने का मतलब है आवृत्ति को आवृत्ति के लिए। तो एक विधि में @foo एक उदाहरण स्तर है।

@@ का अर्थ एक वर्ग चर है, जिसका अर्थ है कि @@ चर वर्ग के दायरे में हैं, और सभी उदाहरण हैं।

: का अर्थ प्रतीक है। रुबी में एक प्रतीक एक विशेष प्रकार की स्ट्रिंग है जिसका तात्पर्य है कि इसका उपयोग एक कुंजी के रूप में किया जाएगा। यदि आप सी #/जावा से आ रहे हैं, तो वे एक enum के मुख्य भाग के उपयोग में समान हैं। कुछ अन्य मतभेद भी हैं, लेकिन मूल रूप से जब भी आप किसी भी प्रकार की कुंजी के रूप में स्ट्रिंग का इलाज करने जा रहे हैं, तो आप इसके बजाय एक प्रतीक का उपयोग करते हैं।

14

वाह, यह एक साथ कई अलग-अलग अवधारणाओं है।

1) = सादा पुराना असाइनमेंट है।

a = 4; 
puts a 

2) => हैश

hash = {'a' => 1, 'b' => 2, 'c' => 3} 
puts hash['b'] # prints 2 

3) @var आप वस्तु उदाहरण चर तक पहुंचने देता है की घोषणा करने के लिए किया जाता है।

class MyObject 
    def set_x(x) 
     @x = x 
    end 
    def get_x 
     @x 
    end 
end 

o = MyObject.new 
o.set_x 3 
puts o.get_x # prints 3 

4) @@var आप वर्ग ('स्थिर') चर पहुंचने देता है।

class MyObject 
    def set_x(x) 
     @@x = x # now you can access '@@x' from other MyObject instance 
    end 
    def get_x 
     @@x 
    end 
end 

o1 = MyObject.new 
o1.set_x 3 
o2 = MyObject.new 
puts o2.get_x # prints 3, even though 'set_x' was invoked on different object 

5) मैं आमतौर पर :var के रूप में विशेष 'लेबल' वर्ग के बारे में सोच। उदाहरण 2 को इस

hash = {:a => 1, :b => 2, :c => 3} 
puts hash[:b] # prints 2 
+0

उदाहरण 3 और 4 मेरे लिए भ्रमित हैं, मैं उदाहरण 3 और 4 में अंतर नहीं देख सकता। –

+0

@ सिमॉन @@ x के बजाय @x के साथ उदाहरण # 4 चलाएं और आप अंतर देखेंगे –

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