रूबी में विभिन्न कोष्ठक का क्या अर्थ है?


85

रूबी में, के बीच क्या फर्क है {}और []?

{} कोड ब्लॉक और हैश दोनों के लिए उपयोग किया जा रहा है।

कर रहे हैं []केवल सरणियों के लिए?

दस्तावेज़ बहुत स्पष्ट नहीं है।

जवाबों:


70

ये संदर्भ पर निर्भर करता है:

  1. जब अपने दम पर, या एक चर को असाइन करना, []ऐरे बनाता है, और {}हैश बनाता है। जैसे

    a = [1,2,3] # an array
    b = {1 => 2} # a hash
    
  2. []एक कस्टम विधि के रूप में ओवरराइड किया जा सकता है, और आमतौर पर हैश से चीजों को लाने के लिए उपयोग किया जाता है (मानक पुस्तकालय []हैश पर एक विधि के रूप में सेट होता है जो समान है fetch)
    एक सम्मेलन यह भी है कि इसे क्लास विधि के रूप में उपयोग किया जाता है जिस तरह से आप static CreateC # या Java में किसी विधि का उपयोग कर सकते हैं । जैसे

    a = {1 => 2} # create a hash for example
    puts a[1] # same as a.fetch(1), will print 2
    
    Hash[1,2,3,4] # this is a custom class method which creates a new hash
    

    उस अंतिम उदाहरण के लिए रूबी हैश डॉक्स देखें ।

  3. यह शायद सबसे मुश्किल एक है - {}ब्लॉकों के लिए भी वाक्यविन्यास है, लेकिन केवल जब एक विधि से पारित किया जाता है तो तर्क को पार करता है।

    जब आप पैरेंस के बिना तरीकों को लागू करते हैं, तो रूबी यह देखती है कि आपने कॉमा को यह पता लगाने के लिए कि तर्क कहाँ समाप्त होते हैं (जहां परेंस होंगे, क्या आपने उन्हें टाइप किया था)

    1.upto(2) { puts 'hello' } # it's a block
    1.upto 2 { puts 'hello' } # syntax error, ruby can't figure out where the function args end
    1.upto 2, { puts 'hello' } # the comma means "argument", so ruby sees it as a hash - this won't work because puts 'hello' isn't a valid hash
    

2
साइड नोट: हैश # लाना बिल्कुल नहीं हैश [[]। {= a => 1,: b => 2} .fetch (: c) IndexError: कुंजी नहीं मिली
tokland

@ टॉकलैंड :cनहीं मिला
yyny

"एक कन्वेंशन यह भी है कि इसे क्लास विधि के रूप में उपयोग किया जाता है उसी तरह आप C # या Java में स्टैटिक क्रिएट मेथड का उपयोग कर सकते हैं।" यह ठीक वही उत्तर है जिसकी मुझे तलाश थी। रूबी के बारे में मुझे सबसे ज्यादा नफरत है, इसका भी एक उत्कृष्ट उदाहरण; रूबी कोड को पढ़ने के लिए आपको बहुत सारे अस्पष्ट छोटे टोटके जानने हैं।
टोनी

21

दूसरा, इतना स्पष्ट नहीं है, का उपयोग []Proc # कॉल और मेथड # कॉल के पर्याय के रूप में है। यह पहली बार हो सकता है जब आप इसका सामना करें। मुझे लगता है कि इसके पीछे तर्क यह है कि यह एक सामान्य फ़ंक्शन कॉल की तरह दिखता है।

उदाहरण के लिए

proc = Proc.new { |what| puts "Hello, #{what}!" }
meth = method(:print)

proc["World"]
meth["Hello",","," ", "World!", "\n"]

9

मोटे तौर पर, आप सही कह रहे हैं। हैश के साथ-साथ, सामान्य शैली यह है कि घुंघराले ब्रेसिज़ {}अक्सर उन ब्लॉकों के लिए उपयोग किए जाते हैं जो एक पंक्ति में सभी का उपयोग कर सकते हैं, बजाय कई लाइनों के उपयोग के do/ endभर में।

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

Hash["key" => "value"]

बस के रूप में मान्य है:

{ "key" => "value" }

3

वर्ग कोष्ठक [] सरणियों को आरंभ करने के लिए उपयोग किया जाता है। [] के शुरुआती मामले के लिए प्रलेखन है

ri Array::[]

घुंघराले कोष्ठक {} का उपयोग हैश को आरंभ करने के लिए किया जाता है। {} के इनिशियलाइज़र मामले के लिए प्रलेखन है

ri Hash::[]

वर्ग कोष्ठक भी आमतौर पर कई कोर रूबी वर्गों में एक विधि के रूप में उपयोग किए जाते हैं, जैसे कि ऐरे, हैश, स्ट्रिंग, और अन्य।

आप उन सभी वर्गों की सूची तक पहुँच सकते हैं जिनके पास विधि "[]" है

ri []

अधिकांश विधियों में एक "[] =" विधि होती है, जो चीजों को निर्दिष्ट करने की अनुमति देती है, उदाहरण के लिए:

s = "hello world"
s[2]     # => 108 is ascii for e
s[2]=109 # 109 is ascii for m
s        # => "hemlo world"

घुंघराले ब्रैकेट को "{...}" के रूप में ब्लॉक पर "डू ... एंड" के बजाय भी इस्तेमाल किया जा सकता है।

एक और मामला जहां आप वर्ग कोष्ठक या घुंघराले कोष्ठक का उपयोग करते हुए देख सकते हैं - विशेष इनिशियलाइज़र में है जहाँ किसी भी प्रतीक का उपयोग किया जा सकता है, जैसे:

%w{ hello world } # => ["hello","world"]
%w[ hello world ] # => ["hello","world"]
%r{ hello world } # => / hello world /
%r[ hello world ] # => / hello world /
%q{ hello world } # => "hello world"
%q[ hello world ] # => "hello world"
%q| hello world | # => "hello world"

2

कुछ उदाहरण:

[1, 2, 3].class
# => Array

[1, 2, 3][1]
# => 2

{ 1 => 2, 3 => 4 }.class
# => Hash

{ 1 => 2, 3 => 4 }[3]
# => 4

{ 1 + 2 }.class
# SyntaxError: compile error, odd number list for Hash

lambda { 1 + 2 }.class
# => Proc

lambda { 1 + 2 }.call
# => 3

2

ध्यान दें कि आप []अपनी कक्षाओं के लिए विधि को परिभाषित कर सकते हैं :

class A
 def [](position)
   # do something
 end

 def @rank.[]= key, val
    # define the instance[a] = b method
 end

end

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