"মানচিত্র" পদ্ধতিটি রুবিতে কী করে?


250

আমি প্রোগ্রামিং এ নতুন। কেউ কি .mapকরতে পারে তা ব্যাখ্যা করতে পারে:

params = (0...param_count).map

9
জিজ্ঞাসা করুন এক একটি সময়ে প্রশ্ন। mapক্রমান্বয়ে (বিশেষ বিবেচনার সাথে) মানগুলিকে রূপান্তর করার জন্য গণনাযোগ্য অবজেক্টগুলিতে একটি সাধারণ "কার্যকরী" পদ্ধতি পাওয়া যায়। ..এবং ...ব্যাপ্তি তৈরির উপায়। এছাড়াও, REPL এর সাথে পরিচিত হন, যেখানে আপনি নিজেরাই এই জিনিসগুলি ব্যবহার করে দেখতে পারেন! :)

5
রুবীর জন্য রিপাবল আইআরবি, রেলের জন্য এটি রেল সি c REPL আপনাকে সরাসরি ভাষা শেল এর বিপরীতে কোড পরীক্ষা করতে দেয়।
গ্যারি

উত্তর:


431

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

3
উদাহরণস্বরূপ ধন্যবাদ spransky। তাহলে।। ম্যাপ থেকে কীভাবে আলাদা?
বিগপোটাটো

2
আহ্ আমি পেয়েছি। সুতরাং। মানচিত্রটি আসলে অ্যারেটিকে পরিবর্তিত করে। মূল অ্যারেটিকে ছোঁয়া ছাড়ার সময় মানগুলি অ্যাক্সেস করতে কেবল অ্যারের মধ্য দিয়ে লুপগুলি আসে?
বিগপোটাতো

24
নৈমিত্তিক পাঠকদের পক্ষে এটি বিপজ্জনক যে উদ্বোধনী বাক্যটি mapযেমনটি বর্ণনা করেছে তেমনmap!
ক্যালিডিক

12
মানচিত্র এবং প্রত্যেকের মধ্যে পার্থক্য দেখতে, একটি আইআরবি উইন্ডো খুলুন এবং নীচের কোডে y এবং z এর ফলাফলগুলি দেখুন: y = [1,2,3]। | ch | x | | x + 1}; z = [1,2,3]। মানচিত্র {| এক্স | x + 1}
ডেভেজ

7
@ ইনকুইজিসিটিভ: 'প্রত্যেকটি' এটিকে কল করে এমন অ্যারে ফিরিয়ে দেয় (উদাহরণস্বরূপ, [1,2,3]) যখন কোনও ব্লক সরবরাহ করা হয়, তখন 'মানচিত্র' ব্লকের দ্বারা গণনা করা মানগুলির সাথে একটি নতুন অ্যারে প্রদান করে। এটি সহায়তা করতে পারে: পরিবর্তনশীল অ্যারি = [1,2,3] সেট করুন এবং এটি অবজেক্ট_আইডি পরীক্ষা করে দেখুন। তারপরে y = ary.each {| x | চালান x + 1}; z = ary.map {| x | | x + 1 এখন y এবং z এর অবজেক্ট_আইডি পরীক্ষা করুন। y এর সাথে অ্যারির মতো একই অবজেক্ট_আইড রয়েছে (কারণ প্রতিটি প্রত্যাবর্তিত অ্যারি), তবে z এর আলাদা একটি اعتراض_id রয়েছে, কারণ মানচিত্রে একটি নতুন অ্যারে ফিরে এসেছে returned
ডেভেজ

66

map, পাশাপাশি selectএবং eachআমার কোডে রুবির অন্যতম ওয়ার্কহর্স।

এটি আপনাকে আপনার অ্যারের প্রতিটি বস্তুতে একটি অপারেশন চালানোর অনুমতি দেয় এবং সেগুলি একই জায়গায় ফিরিয়ে দেয়। উদাহরণ হ'ল একের পর এক সংখ্যার অ্যারে বৃদ্ধি করা:

[1,2,3].map {|x| x + 1 }
#=> [2,3,4]

আপনি যদি আপনার অ্যারের উপাদানগুলিতে একটি পদ্ধতি চালাতে পারেন তবে আপনি এটির মতো একটি শর্টহ্যান্ড স্টাইলে এটি করতে পারেন:

  1. উপরের উদাহরণ দিয়ে এটি করতে আপনাকে এই জাতীয় কিছু করতে হবে

    class Numeric
      def plusone
        self + 1
      end
    end
    [1,2,3].map(&:plusone)
    #=> [2,3,4]
  2. আরও সহজেই অ্যাম্পারস্যান্ড শর্টকাট কৌশলটি ব্যবহার করতে, আসুন একটি আলাদা উদাহরণ ব্যবহার করুন:

    ["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)
tjmcewan

1
এইচএমএম শোনাচ্ছে আপনি privateক্লাসের ভিতরে ঘোষণা করেছেন যেখানে আপনি নিজের পদ্ধতিটি রাখার আগে আপনি নিজের পদ্ধতিটি
রেখেছেন

হ্যাঁ, এটি পুরোপুরি করে। ব্যতীত এটি ছিল না। :( সবার আগে এটি সরল স্ক্রিপ্টে ডাব্লু / ও ক্লাসে ছিল, দ্বিতীয়ত সরল আইআরবিতে। এখানে আপনার কোডের আমার অনুলিপি / পেস্টটি দেওয়া হয়েছে: gist.github.com/tjmcewan/a7e4feb2976a93a5eef9
tjmcewan

হ্যাঁ, আমি আমার কোডটিতে সম্পূর্ণরূপে একটি খারাপ উদাহরণ রেখেছি দুঃখিত আমি দুঃখিত। পরিবর্তিত কোড চেষ্টা করুন। এটি এখন কাজ করে ...
বোল্ডার_রবি

1
@ পাথর_রবি একটি সাধারণ পদ্ধতি দিয়ে এটি করার কোন উপায় আছে - যেমন কোনও শ্রেণি পদ্ধতি নয়?
টেক্কনোলগি

6

রুবি ২.৪ ব্যবহার করে আপনি একই জিনিসটি ব্যবহার করে করতে পারেন transform_values, এই বৈশিষ্ট্যটি রেল থেকে রুবিতে সরানো হয়েছে।

h = {a: 1, b: 2, c: 3}

h.transform_values { |v| v * 10 }
 #=> {a: 10, b: 20, c: 30}

4

0..param_countএর অর্থ "প্যারাম_কাউন্ট পর্যন্ত এবং অন্তর্ভুক্ত" 0...param_countঅর্থ "পর্যন্ত, তবে প্যারাম_কাউন্ট সহ নয়"

Range#mapEnumerableএটি কোনও অ্যারে ফেরত দেয় না , এটি এটি একটি অ্যারেতে ম্যাপ করে। এটা যেমন হয় Range#to_a


3

এটি প্রতিটি আইটেমের জন্য একটি ফাংশন "মানচিত্র" করে Enumerable- এই ক্ষেত্রে, একটি ব্যাপ্তি। সুতরাং এটি 0 থেকে প্রতিটি পূর্ণসংখ্যার জন্য একবারে পাস করা ব্লকটিকে কল করবে param_count(একচেটিয়া - আপনি বিন্দু সম্পর্কে সঠিক) এবং প্রতিটি রিটার্নের মান সমেত একটি অ্যারে প্রদান করবে।

এখানে জন্য ডকুমেন্টেশন Enumerable#mapএটির একটি উপনাম রয়েছে collect,।


এটি অদ্ভুত, তবে Range#mapআসলে এটিকে অ্যারেতে রূপান্তরিত করে।
পেড্রো ন্যাসিমেণ্টো

1
@ পেড্রো ন্যাসিমেণ্টো: হ্যাঁ ... এটাই আমি বলেছি?
রাই-

দুঃখিত, আমি জানতাম না যে নিজে থেকে ডাকা মানচিত্র Enumerableপ্রতিটিটির মতো একটিও ফিরিয়ে দেয়নি । আমি ভেবেছি এটা করেছে।
পেড্রো ন্যাসিমেণ্টো

2

মানচিত্রটি গণনাযোগ্য মডিউলের একটি অংশ। উদাহরণ হিসাবে "সংগ্রহ" এর সাথে খুব মিল 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}

মানচিত্র একটি অ্যারের মাধ্যমে পুনরাবৃত্ত মানগুলি সরবরাহ করে যা ব্লক পরামিতি দ্বারা ফিরে আসে।


মানচিত্র সংগ্রহ হিসাবে ঠিক একই।
বিকেএসপুরজন

0

#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()}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.