উত্তর:
mapপদ্ধতি একটি গণনীয় বস্তু এবং একটি ব্লক লাগে, এবং প্রতিটি উপাদানের জন্য ব্লক চালায়, (মূল বস্তু অপরিবর্তিত যদি না আপনি ব্যবহার ব্লক থেকে প্রতিটি ফিরে মান outputting map!):
[1, 2, 3].map { |n| n * n } #=> [1, 4, 9]
Arrayএবং Rangeঅসংখ্য প্রকারের। 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আমার কোডে রুবির অন্যতম ওয়ার্কহর্স।
এটি আপনাকে আপনার অ্যারের প্রতিটি বস্তুতে একটি অপারেশন চালানোর অনুমতি দেয় এবং সেগুলি একই জায়গায় ফিরিয়ে দেয়। উদাহরণ হ'ল একের পর এক সংখ্যার অ্যারে বৃদ্ধি করা:
[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এটির জন্য একটি উপাধিও রয়েছে concept ধারণাটির জন্য collectআপনার পক্ষে যা ভাল কাজ করে তা ব্যবহার করুন))
আরও সহায়ক তথ্য:
আপনি যে এনুম্যুয়াল অবজেক্টটি চালাচ্ছেন eachবা তার mapউপরে রয়েছে সে পরিমাণে উপাদানসমূহের একটি সেট (হ্যাশস, অ্যারে) রয়েছে, আপনি আপনার ব্লক পাইপের অভ্যন্তরে elements উপাদানগুলির প্রত্যেকটি ঘোষণা করতে পারেন:
[["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 এবং 'ভুল সংখ্যায় আরগস' রুবিতে 1.9 / 1.8 এ। যাই হোক, আমি একটি ল্যামডা ব্যবহৃত: plusone = ->(x) { x + 1 }তারপর প্রতীক সুনির্দিষ্টভাবে উল্লেখ করা খুঁজে নিতে: [1,2,3].map(&plusone)।
privateক্লাসের ভিতরে ঘোষণা করেছেন যেখানে আপনি নিজের পদ্ধতিটি রাখার আগে আপনি নিজের পদ্ধতিটি
0..param_countএর অর্থ "প্যারাম_কাউন্ট পর্যন্ত এবং অন্তর্ভুক্ত"
0...param_countঅর্থ "পর্যন্ত, তবে প্যারাম_কাউন্ট সহ নয়"
Range#mapEnumerableএটি কোনও অ্যারে ফেরত দেয় না , এটি এটি একটি অ্যারেতে ম্যাপ করে। এটা যেমন হয় Range#to_a।
এটি প্রতিটি আইটেমের জন্য একটি ফাংশন "মানচিত্র" করে Enumerable- এই ক্ষেত্রে, একটি ব্যাপ্তি। সুতরাং এটি 0 থেকে প্রতিটি পূর্ণসংখ্যার জন্য একবারে পাস করা ব্লকটিকে কল করবে param_count(একচেটিয়া - আপনি বিন্দু সম্পর্কে সঠিক) এবং প্রতিটি রিটার্নের মান সমেত একটি অ্যারে প্রদান করবে।
এখানে জন্য ডকুমেন্টেশন Enumerable#map। এটির একটি উপনাম রয়েছে collect,।
Range#mapআসলে এটিকে অ্যারেতে রূপান্তরিত করে।
Enumerableপ্রতিটিটির মতো একটিও ফিরিয়ে দেয়নি । আমি ভেবেছি এটা করেছে।
মানচিত্রটি গণনাযোগ্য মডিউলের একটি অংশ। উদাহরণ হিসাবে "সংগ্রহ" এর সাথে খুব মিল Very
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ক্রমান্বয়ে (বিশেষ বিবেচনার সাথে) মানগুলিকে রূপান্তর করার জন্য গণনাযোগ্য অবজেক্টগুলিতে একটি সাধারণ "কার্যকরী" পদ্ধতি পাওয়া যায়।..এবং...ব্যাপ্তি তৈরির উপায়। এছাড়াও, REPL এর সাথে পরিচিত হন, যেখানে আপনি নিজেরাই এই জিনিসগুলি ব্যবহার করে দেখতে পারেন! :)