Ruby Language
यात्रा
खोज…
से प्रत्येक
रूबी के पास कई प्रकार के एन्यूमरेटर हैं लेकिन पहले और सबसे सरल प्रकार के एन्यूमरेटर each
साथ शुरू each
। हम each
कार्य के लिए 1
और 10
बीच प्रत्येक संख्या के लिए या odd
even
प्रिंट करेंगे कि each
कैसे काम करता है।
मूल रूप से तथाकथित blocks
को पारित करने के दो तरीके हैं। एक block
कोड का एक टुकड़ा है जिसे पारित किया जा रहा है जिसे विधि द्वारा निष्पादित किया जाएगा। each
विधि एक block
लेता है जिसे वह वस्तुओं के संग्रह के प्रत्येक तत्व के लिए कहता है जिस पर उसे बुलाया गया था।
एक ब्लॉक को एक विधि से पास करने के दो तरीके हैं:
विधि 1: इनलाइन
(1..10).each { |i| puts i.even? ? 'even' : 'odd' }
इसे हल करने के लिए यह एक बहुत ही संकुचित और माणिक तरीका है। चलो इस टुकड़े को टुकड़े करके तोड़ दें।
-
(1..10)
1
से10
समावेशी तक की सीमा है। यदि हम चाहते थे कि यह1
से10
अनन्य हो, तो हम लिखेंगे(1...10)
। -
.each
एक एन्यूमरेटर है जोeach
तत्व को उस वस्तु पर गणना करता है जिस पर वह कार्य कर रहा है। इस मामले में, यह सीमा मेंeach
संख्या पर कार्य करता है। -
{ |i| puts i.even? ? 'even' : 'odd' }
each
कथन के लिए ब्लॉक है, जिसे स्वयं आगे तोड़ दिया जा सकता है।-
|i|
इसका मतलब है कि श्रृंखला में प्रत्येक तत्व पहचानकर्ता द्वारा ब्लॉक के भीतर प्रतिनिधित्व किया हैi
। -
puts
हर बार यह प्रिंट बाद एक स्वचालित लाइन ब्रेक है कि रूबी में एक निर्गम तरीका है। (हम स्वचालित लाइन ब्रेक नहीं चाहते हैं तो हमprint
उपयोग कर सकते हैं) -
i.even?
अगरi
भी जाँच करताi
हम भीi % 2 == 0
उपयोग कर सकते थे; हालांकि, यह तरीकों में निर्मित उपयोग करने के लिए बेहतर है। -
? "even" : "odd"
यह माणिक का टर्नरी ऑपरेटर है। जिस तरह से एक टर्नरी ऑपरेटर का निर्माण होता है वहexpression ? a : b
। इसके लिए कम है
if expression a else b end
-
एक पंक्ति से अधिक लंबे कोड के लिए block
को एक multiline block
रूप में पारित किया जाना चाहिए।
विधि 2: बहुस्तरीय
(1..10).each do |i| if i.even? puts 'even' else puts 'odd' end end
एक multiline block
में do
ओपनिंग ब्रैकेट को बदल देता है और inline
स्टाइल से एंडिंग कोष्ठक को end
करता है।
रूबी रिवर्स_चेक का भी समर्थन करती है। यह ऐरे को पीछे की ओर से घुमाएगा।
@arr = [1,2,3,4]
puts @arr.inspect # output is [1,2,3,4]
print "Reversed array elements["
@arr.reverse_each do |val|
print " #{val} " # output is 4 3 2 1
end
print "]\n"
एक वर्ग में कार्यान्वयन
Enumerable
रूबी में सबसे लोकप्रिय मॉड्यूल है। इसका उद्देश्य आपको map
, select
, reduce
, आदि जैसे मनोरंजक तरीके प्रदान करना है, जिनमें Enumerable
उपयोग करने वाले वर्ग शामिल हैं, Array
, Hash
, Range
। इसका उपयोग करने के लिए, आपको include Enumerable
को include Enumerable
और each
लागू each
।
class NaturalNumbers
include Enumerable
def initialize(upper_limit)
@upper_limit = upper_limit
end
def each(&block)
0.upto(@upper_limit).each(&block)
end
end
n = NaturalNumbers.new(6)
n.reduce(:+) # => 21
n.select(&:even?) # => [0, 2, 4, 6]
n.map { |number| number ** 2 } # => [0, 1, 4, 9, 16, 25, 36]
नक्शा
परिवर्तित वस्तु लौटाता है, लेकिन मूल वस्तु वैसी ही रहती है जैसी कि थी। उदाहरण के लिए:
arr = [1, 2, 3]
arr.map { |i| i + 1 } # => [2, 3, 4]
arr # => [1, 2, 3]
map!
मूल वस्तु को बदलता है:
arr = [1, 2, 3]
arr.map! { |i| i + 1 } # => [2, 3, 4]
arr # => [2, 3, 4]
नोट: आप समान कार्य collect
लिए collect
का उपयोग भी कर सकते हैं।
जटिल वस्तुओं पर फेरबदल करना
Arrays
आप नेस्टेड सरणियों पर पुनरावृति कर सकते हैं:
[[1, 2], [3, 4]].each { |(a, b)| p "a: #{ a }", "b: #{ b }" }
निम्नलिखित सिंटैक्स की भी अनुमति है:
[[1, 2], [3, 4]].each { |a, b| "a: #{ a }", "b: #{ b }" }
उत्पादन करेंगे:
"a: 1"
"b: 2"
"a: 3"
"b: 4"
हैश
आप कुंजी-मूल्य जोड़े पर पुनरावृति कर सकते हैं:
{a: 1, b: 2, c: 3}.each { |pair| p "pair: #{ pair }" }
उत्पादन करेंगे:
"pair: [:a, 1]"
"pair: [:b, 2]"
"pair: [:c, 3]"
आप एक साथ कुंजियों और मूल्यों पर पुनरावृति कर सकते हैं:
{a: 1, b: 2, c: 3}.each { |(k, v)| p "k: #{ k }", "v: #{ k }" }
उत्पादन करेंगे:
"k: a"
"v: a"
"k: b"
"v: b"
"k: c"
"v: c"
इटरेटर के लिए
यह 4 से 13 (समावेशी) से पुनरावृत्त होता है।
for i in 4..13
puts "this is #{i}.th number"
end
हम इसके लिए उपयोग करने वाले सरणियों पर पुनरावृति भी कर सकते हैं
names = ['Siva', 'Charan', 'Naresh', 'Manish']
for name in names
puts name
end
सूचकांक के साथ परिवर्तन
कभी-कभी आप किसी एन्यूमरेटर पर पुनरावृत्ति करते हुए वर्तमान तत्व की स्थिति ( सूचकांक ) जानना चाहते हैं। इस तरह के उद्देश्य के लिए, रूबी with_index
विधि प्रदान करता है। इसे सभी प्रगणकों पर लागू किया जा सकता है। मूल रूप से, एन्यूमरेशन में with_index
जोड़कर, आप उस एन्यूमरेशन की गणना कर सकते हैं। सूचकांक को दूसरे तर्क के रूप में एक ब्लॉक में भेजा जाता है।
[2,3,4].map.with_index { |e, i| puts "Element of array number #{i} => #{e}" }
#Element of array number 0 => 2
#Element of array number 1 => 3
#Element of array number 2 => 4
#=> [nil, nil, nil]
with_index
का एक वैकल्पिक तर्क है - पहला सूचकांक जो डिफ़ॉल्ट रूप से 0
है:
[2,3,4].map.with_index(1) { |e, i| puts "Element of array number #{i} => #{e}" }
#Element of array number 1 => 2
#Element of array number 2 => 3
#Element of array number 3 => 4
#=> [nil, nil, nil]
एक विशिष्ट विधि each_with_index
। इसके और each.with_index
बीच एकमात्र अंतर यह है कि आप इसके लिए एक तर्क पारित नहीं कर सकते हैं, इसलिए हर समय पहला सूचकांक 0
।
[2,3,4].each_with_index { |e, i| puts "Element of array number #{i} => #{e}" }
#Element of array number 0 => 2
#Element of array number 1 => 3
#Element of array number 2 => 4
#=> [2, 3, 4]