जवाबों:
map
विधि एक गणनीय वस्तु और एक ब्लॉक लेता है, और प्रत्येक तत्व के लिए ब्लॉक चलाता है, (मूल वस्तु में कोई बदलाव नहीं है जब तक कि आप का उपयोग ब्लॉक से प्रत्येक दिए गए मान outputting map!)
:
[1, 2, 3].map { |n| n * n } #=> [1, 4, 9]
Array
और Range
enumerable प्रकार हैं। map
एक ब्लॉक के साथ एक ऐरे देता है। map!
मूल सरणी को बदल देता है।
इस कहाँ उपयोगी है, और के बीच अंतर क्या है map!
और each
? यहाँ एक उदाहरण है:
names = ['danil', 'edmund']
# here we map one array to another, convert each element by some rule
names.map! {|name| name.capitalize } # now names contains ['Danil', 'Edmund']
names.each { |name| puts name + ' is a programmer' } # here we just do something with each element
उत्पादन:
Danil is a programmer
Edmund is a programmer
map
जैसे कि यह थाmap!
map
के साथ-साथ select
और each
मेरे कोड में रूबी के workhorses से एक है।
यह आपको अपने प्रत्येक सरणी के ऑब्जेक्ट पर एक ऑपरेशन चलाने और सभी को एक ही स्थान पर वापस करने की अनुमति देता है। एक उदाहरण के लिए एक के बाद एक संख्या बढ़ाना होगा:
[1,2,3].map {|x| x + 1 }
#=> [2,3,4]
यदि आप अपने सरणी के तत्वों पर एक एकल विधि चला सकते हैं, तो आप इसे शॉर्टहैंड-स्टाइल में कर सकते हैं:
उपरोक्त उदाहरण के साथ ऐसा करने के लिए आपको कुछ ऐसा करना होगा
class Numeric
def plusone
self + 1
end
end
[1,2,3].map(&:plusone)
#=> [2,3,4]
एम्परसेंड शॉर्टकट तकनीक का अधिक उपयोग करने के लिए, आइए एक अलग उदाहरण का उपयोग करें:
["vanessa", "david", "thomas"].map(&:upcase)
#=> ["VANESSA", "DAVID", "THOMAS"]
रूबी में डेटा ट्रांसफ़ॉर्म करने में अक्सर map
ऑपरेशन का झरना शामिल होता है । अध्ययन map
और select
, वे प्राथमिक पुस्तकालय में सबसे उपयोगी रूबी विधियों में से कुछ हैं। वे बस के रूप में महत्वपूर्ण के रूप में कर रहे हैं each
।
( map
इसके लिए एक उपनाम भी है collect
। वैचारिक रूप से आपके लिए जो भी सबसे अच्छा काम करता है उसका उपयोग करें।)
अधिक उपयोगी जानकारी:
यदि आपके द्वारा चलाए जा रहे Enumerable ऑब्जेक्ट each
या map
Enumerable तत्वों (hashes, arrays) का एक सेट होता है, तो आप अपने ब्लॉक पाइप के अंदर उन तत्वों में से प्रत्येक को घोषित कर सकते हैं जैसे:
[["audi", "black", 2008], ["bmw", "red", 2014]].each do |make, color, year|
puts "make: #{make}, color: #{color}, year: #{year}"
end
# Output:
# make: audi, color: black, year: 2008
# make: bmw, color: red, year: 2014
हाश के मामले में (एक Enumerable
वस्तु भी , एक हैश केवल दुभाषिया के लिए विशेष निर्देशों के साथ ट्यूपल्स की एक सरणी है)। पहला "पाइप पैरामीटर" कुंजी है, दूसरा मूल्य है।
{:make => "audi", :color => "black", :year => 2008}.each do |k,v|
puts "#{k} is #{v}"
end
#make is audi
#color is black
#year is 2008
वास्तविक प्रश्न का उत्तर देने के लिए:
मान लें कि params
यह एक हैश है, तो इसके माध्यम से मैप करने का यह सबसे अच्छा तरीका होगा: हैश में प्रत्येक व्याख्या किए गए टपल के लिए कुंजी और मान युग्म को पकड़ने के लिए एक के बजाय दो ब्लॉक पैरामीटर का उपयोग करें।
params = {"one" => 1, "two" => 2, "three" => 3}
params.each do |k,v|
puts "#{k}=#{v}"
end
# one=1
# two=2
# three=3
NoMethodError: private method 'plusone' called for 1:Fixnum
रूबी में 2 / 'गलत संख्या में args' 1.9 / 1.8 में मिलता हूं । वैसे भी, मैंने एक लैम्ब्डा का उपयोग किया है: plusone = ->(x) { x + 1 }
फिर प्रतीक विनिर्देशक को बाहर निकालें [1,2,3].map(&plusone)
:।
private
कक्षा के अंदर घोषित किया जहाँ आप अपना तरीका
0..param_count
का अर्थ है "और param_count सहित"।
0...param_count
का अर्थ है "अप करने के लिए, लेकिन param_count शामिल नहीं"।
Range#map
एक वापस नहीं करता है Enumerable
, यह वास्तव में इसे एक सरणी में मैप करता है। यह वैसा ही है Range#to_a
।
यह प्रत्येक आइटम को "मैप" करता है Enumerable
- इस मामले में, एक सीमा। तो यह प्रत्येक पूर्णांक के लिए 0 param_count
(अनन्य - आप डॉट्स के बारे में सही हो) के लिए एक बार पास किए गए ब्लॉक को कॉल करेगा और एक सरणी लौटाएगा जिसमें आपका रिटर्न मान होगा।
यहाँ के लिए प्रलेखन है Enumerable#map
। यह भी एक उपनाम है, collect
।
Range#map
वास्तव में इसे एक सरणी में परिवर्तित करता है।
Enumerable
प्रत्येक द्वारा बुलाया गया नक्शा प्रत्येक की तरह वापस नहीं आया । मुझे लगा कि यह किया है।
मैप एन्युमरेबल मॉड्यूल का एक हिस्सा है। उदाहरण के लिए "इकट्ठा" के समान:
Class Car
attr_accessor :name, :model, :year
Def initialize (make, model, year)
@make, @model, @year = make, model, year
end
end
list = []
list << Car.new("Honda", "Accord", 2016)
list << Car.new("Toyota", "Camry", 2015)
list << Car.new("Nissan", "Altima", 2014)
p list.map {|p| p.model}
मानचित्र एक मान के माध्यम से पुनरावृत्ति करने वाले मान प्रदान करता है जो ब्लॉक मापदंडों द्वारा वापस किए जाते हैं।
#each
#each
एक सरणी में प्रत्येक तत्व के लिए एक फ़ंक्शन चलाता है। निम्नलिखित दो कोड अंश समकक्ष हैं:
x = 10
["zero", "one", "two"].each{|element|
x++
puts element
}
x = 10
array = ["zero", "one", "two"]
for i in 0..2
x++
puts array[i]
end
#map
#map
एक सरणी के प्रत्येक तत्व पर एक फ़ंक्शन लागू करता है, जिसके परिणामस्वरूप सरणी वापस आती है। निम्नलिखित समतुल्य हैं:
array = ["zero", "one", "two"]
newArray = array.map{|element| element.capitalize()}
array = ["zero", "one", "two"]
newArray = []
array.each{|element|
newArray << element.capitalize()
}
#map!
#map!
की तरह है #map
, लेकिन जगह में सरणी को संशोधित करता है। निम्नलिखित समतुल्य हैं:
array = ["zero", "one", "two"]
array.map!{|element| element.capitalize()}
array = ["zero", "one", "two"]
array = array.map{|element| element.capitalize()}
map
एक सामान्य "कार्यात्मक" विधि है, जो एक अनुक्रम में मूल्यों को बदलने के लिए उपयोग की जाने वाली Enumerable वस्तुओं पर पाई जाती है (विशेष विचारों के साथ)।..
और...
रेंज बनाने के तरीके हैं। इसके अलावा, आरईपीएल से परिचित हों , जहां आप इस सामान को खुद आज़मा सकते हैं! :)