2012-06-04 7 views
8

मैं रूबी में स्क्वायर ब्रैकेट [] वाक्यविन्यास में काफी कुछ आ रहा हूं, लेकिन ऐसा कभी भी ऐसा ही नहीं लगता है। क्या कोई भी सभी रूबी में स्क्वायर ब्रैकेट [] के लिए अलग-अलग उपयोगों को सूचीबद्ध कर सकता है, इसलिए मेरा दिमाग इस असाधारण अंतहीन बहुमुखी प्रतीक पर एक संभाल सकता है? (कैसे यह संभव है कि एक प्रतीक इतना बिना रूबी दुभाषिया उलझन में हो रही कर सकते हैं?)रुबी में [वर्ग ब्रैकेट] के सभी अलग-अलग उपयोग क्या हैं?

उदाहरण:

  • [] और []= तरीकों
  • %q[...]
  • [1,2,3][0]
  • hash["a"] = 3
  • ary = []
  • /[^A-Fa-f0-9]/
  • "Is a string"[5,3]
+3

http://ruby-doc.org/core-1.9.3/ पर जाएं और "विधि" खोज बॉक्स में '[]' टाइप करें, जो आपको कोर में इसके उपयोगों की एक सूची देगा। गैर-मूल वर्ग, निश्चित रूप से, '[]' और '[] = 'ऑपरेटरों के लिए अपने स्वयं के कार्यान्वयन प्रदान कर सकते हैं। –

+0

कुछ उदाहरण दें! – Ashe

+0

[] और [] = विधियों में कोई समस्या नहीं है,% w [a b c] और [1,2,3] [1] सरणी अनुक्रमण के बारे में क्या? और क्या? '[]' पूरे स्थान पर पॉप-अप हो रहा है और मुझे जो पता नहीं है उसके बारे में मुझे असहज होना शुरू हो रहा है। –

उत्तर

7

ठीक है, सिर्फ मेरे अपने नोट्स के लिए मैं गया हूं और Holger Just's answer पर निर्माण कर रहा हूं, निम्नलिखित के साथ आना: रूबी में स्क्वायर ब्रैकेट का उपयोग 6 उपयोगों में विभाजित किया जा सकता है, उनमें से 3 रूबी की विधि परिभाषाओं और उनमें से 3 अर्थपूर्ण संरचनाओं का एक हिस्सा है।

विधि परिभाषा

वस्तु वर्ग तरीकों सरणी के माध्यम से निर्माण :: [], हैश :: []

Array.[](1,2,3) #=> [1,2,3]      #Un-sugared notation 
Array["a","b","c"] #=> ["a","b","c"]    #Sugared equivalent 
Hash["a", 100, "b", 200] #=> {"a"=>100, "b"=>200} 

शाब्दिक कंस्ट्रक्टर्स से कोई लेना देना कुछ भी नहीं है, हालांकि यह करता है वही चीज।

उदाहरण विधियों के माध्यम से तत्व संदर्भ Array # [], Bignum # [], Continuation # [], Fixnum # [], हैश # [], MatchData # [], विधि # [], ProC# [], स्ट्रिंग # [], Struct # [], प्रतीक # [], थ्रेड # [], और कक्षा तरीकों डिर :: [], ENV :: []

ary = [1,2,"abc", [15,16,[26,27]]] 
ary.[](2) #=> "abc"    #Un-sugared notation 
ary[2] #=> "abc"     #Sugared equivalent 
ary[0,2] #=> [1,2] 
ary[3][2][1] #=> 26 
[1,2,3][0] #=> 1 
"Is a string"[7,3] #=> "rin" 

तत्व उदाहरण विधियों के माध्यम से काम सरणी # [] =, हैश # [] =, स्ट्रिंग # [] =, Struct # [] =, थ्रेड # [] =, और वर्ग विधि ENV :: [] =

ary = [1,2,3] 
ary.[]=(1,"abc") #=> [1,"abc",3] #un-sugared notation 
ary[2] = "def" #=> [1,"abc","def"] #Sugared equivalent 
hash = {"a"=>1, "b"=>2} 
hash["a"] = 3 #=> {"a"=>3, "b"=>2} 

सिमेंटिक निर्माणों

शाब्दिक शृंखला निर्माता के माध्यम से वस्तु निर्माण

ary = [] 

रूबी में शाब्दिक कंस्ट्रक्टर्स का एक समूह है कि के उपयोग के माध्यम से संबंधित वर्ग की एक वस्तु बनाने के हैं (आमतौर पर) एक साधारण प्रतीक जोड़ी, सरणी वस्तुओं के लिए शाब्दिक कन्स्ट्रक्टर स्क्वायर ब्रैकेट्स: ऐरे [], हैश {}, प्रो ->(){}, रेंज .. और ..., रेगेक्स //, स्ट्रिंग "" और '', प्रतीक : और :""। % अंकन

%q[hello there you] #=> "hello there you"   # String % notation 
%w[hello there you] #=> ["hello", "there", "you"] # Array % notation 

के माध्यम से

वस्तु निर्माण यह है नहीं, कडाई के वर्ग ब्रैकेट अंकन, बल्कि दो प्रतीक-जोड़ी अंकन जिनमें से आप वर्ग कोष्ठक का उपयोग कर सकते यदि आप चाहें तो।तो %[email protected] there [email protected] समान रूप से मान्य है।

रूबी के नियमित अभिव्यक्ति

/[^A-Fa-f0-9]/ 

वर्गाकार कोष्ठक रूबी नियमित अभिव्यक्ति में चरित्र वर्गों से संकेत मिलता है।

मुझे Dir :: glob विधि में उपयोग के लिए एक पैटर्न के रूप में [] का एक और उपयोग मिला, लेकिन यह नियमित रूप से अभिव्यक्तियों में बिल्कुल कार्य करता है। फिर भी, यह इंगित करता है कि रुबी के 1500+ तरीकों में संभवतः अधिक उपयोग छिपे हुए हैं।

9

वर्ग कोष्ठक दो सख्त संदर्भों और एक वैकल्पिक एक में कर रहे हैं:

डिफाइनिंग सरणी
सरणी, यानी उपलब्ध कराने के एक डेटा संरचना और आदेश दिया तत्वों की सूची निर्दिष्ट किया जा सकता [1,2,3] जैसे वाक्यविन्यास का उपयोग करके कोड में। यह ठीक उसी क्रम में तीन तत्व 1, 2, और 3 के साथ एक सरणी बनाता है। फिर आप each या map जैसे पुनरावृत्तियों के कार्यों के उपयोग से सरणी पर फिर से सक्रिय कर सकते हैं या आप नीचे दिखाए गए अनुसार अपनी अनुक्रमणिका आईडी द्वारा सीधे विशिष्ट तत्वों तक पहुंच सकते हैं।

सरणी में तत्वों तक पहुंचना और उसे हैश
Hashes (भी बुलाया HashMaps, शब्दकोशों, या साहचर्य अन्य भाषाओं में सरणियों) भी सरणियों के समान तत्व होते हैं। इससे अलग हैं कि वे अपना डेटा अनॉर्डर्ड स्टोर करते हैं। डेटा को एक पूर्णांक आईडी द्वारा एक्सेस नहीं किया जाता है जैसा कि सरणी के मामले में होता है लेकिन मनमानी कुंजी (आमतौर पर एक प्रतीक या स्ट्रिंग) के साथ होता है। यह उदा। से अलग है PHP जहां एक ही ऐरे प्रकार का उपयोग दोनों के लिए किया जाता है।

डेटा तक पहुंच को [] और []= दोनों विधियों और एरे के लिए उपयोग की जाने वाली विधियों द्वारा सुविधा प्रदान की जाती है।

my_array = [:a, :b, :c] 
second_element = my_array[1] 
# => :b 
# notice that the first element in arrays always has the index 0 

my_hash = {:a => 1, :b => 2, :c => 3} 
element_of_b = my_hash[:b] 
# => 2 

ब्रैकेट के लिए यह सामान्य उपयोग केस है। रूबी कोड में, आप कभी-कभी ब्रैकेट फ़ंक्शंस को लागू करने वाले अन्य वर्गों को देख सकते हैं। वे या तो सरणी या हैंश के समान पहुंच की अनुमति देने के लिए ऐसा करते हैं और फिर आम तौर पर यह अपेक्षा की जाती है कि ये वर्ग उन लोगों के समान व्यवहार करते हैं लेकिन यह किसी भी तरह लागू नहीं होता है। Duck Typing भी देखें।

% संकेतन
रूबी एक तिहाई वाक्य रचना आम से तार (और अन्य वस्तुओं) बनाने के लिए अलग है। इस वाक्यविन्यास का उपयोग करते हुए, कोड में शाब्दिक स्ट्रिंग " या ' से संलग्न नहीं है लेकिन एक विशेष डिलीमीटर का उपयोग करें।यह एक प्रतिशत चिह्न के साथ शुरू होता वस्तु को निर्दिष्ट एकल वर्ण बनाया जाना और लगभग किसी भी चरित्र परिसीमक के रूप में चुना है के लिए:

a = %w[foo bar baz] 
b = %w{foo bar baz} 
c = %wxfoo bar bazx 
d = ["foo", "bar", "baz"] 

सभी तीन उदाहरण एक ही सरणी पैदा करते हैं। कृपया इस वाक्यविन्यास का उपयोग करने के लिए कुछ documentation देखें और रुबी में कौन से अन्य संशोधक वर्ण उपलब्ध हैं।

हालांकि ब्रैकेट का उपयोग करना आम है, लेकिन यह आवश्यक नहीं है और यदि आवश्यक हो तो प्रतिस्थापित किया जा सकता है। यह केवल सलाहकार है क्योंकि इस नोटेशन का सबसे आम उपयोग एक व्हाइटस्पेस-पृथक स्ट्रिंग (जैसा कि ऊपर देखा गया है) से तत्वों की एक सरणी बनाना है। इस प्रकार, ब्रैकेट्स का उपयोग यह और स्पष्ट करता है कि एक सरणी वापस आती है क्योंकि सिंटैक्स मूल सरणी विनिर्देश के समान दिखता है।

+0

और हाँ, मुझे पता है कि रूबी 1.9 में हैश का आदेश दिया गया है। लेकिन उस तथ्य पर अत्यधिक भरोसा करना आश्चर्यजनक होगा क्योंकि तत्वों को बदलने और मेरी आंखों में डेटा संरचना के बलात्कार का प्रतिनिधित्व करता है। मुझे अपने हैंश अनियंत्रित पसंद हैं :) –

+0

Thx बहुत अधिक। हालांकि, मेरे प्रश्न का मुख्य उद्देश्य प्रत्येक उपयोग के स्पष्टीकरण के बजाय '[]' के उपयोग की पूरी सूची प्राप्त करना है (हालांकि यह एक अच्छा बोनस होगा)। मैं चाहता हूं कि कोई व्यक्ति '[]' के उपयोग को सूचीबद्ध करे, फिर मुझे बताएं "यह सब कुछ है"। क्या मूल प्रश्न में मेरे उदाहरणों में बहुत अधिक उपयोग हो सकते हैं, शायद 10 से अधिक, या सिर्फ मेरे उदाहरण हैं? (मैंने अभी एक और उपयोग के बारे में सीखा है: अज्ञात कार्यों की कॉलिंग, वे कभी भी क्या हैं।) –

+2

ठीक है, आपके पास ऊपर वर्णित वाक्यविन्यास तत्व हैं। इससे कोई और नहीं है। हालांकि, कई वर्ग '[] 'विधियों को लागू करते हैं जहां उनका मतलब अलग-अलग चीजें हैं। इन उपयोगों के लिए एक विस्तृत सूची नहीं हो सकती है। एक और उदाहरण यह है कि 'प्रो' वर्ग proc को कॉल करने के लिए '[]' विधि लागू करता है। लेकिन यह एक नया उपयोग नहीं है लेकिन ऊपर उल्लिखित दूसरी विधि को लागू करता है। आम तौर पर, आपको उपर्युक्त पैटर्न में से किसी एक को पहचानना है। यदि यह दूसरा है तो आपको यह पता लगाने के लिए दस्तावेज से परामर्श करना होगा कि संबंधित विधि के अर्थशास्त्र क्या हैं। –

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