রুবিতে সূচী দিয়ে কীভাবে মানচিত্র করবেন?


উত্তর:


835

আপনি যদি রুবি ১.৮..7 বা ১.৯ ব্যবহার করছেন, আপনি পুনরুক্তিবিহীন পদ্ধতিগুলি যেমন each_with_indexকোনও ব্লক ছাড়াই ডেকে পাঠানো হয় এমন কোনও Enumeratorবস্তু ফিরিয়ে আনুন , যা আপনি Enumerableযেমন পদ্ধতিতে কল করতে পারেন তা ব্যবহার করতে পারেন map। সুতরাং আপনি এটি করতে পারেন:

arr.each_with_index.map { |x,i| [x, i+2] }

1.8.6 এ আপনি করতে পারেন:

require 'enumerator'
arr.enum_for(:each_with_index).map { |x,i| [x, i+2] }

ধন্যবাদ! আপনি কি আমাকে ডকুমেন্টেশনের জন্য একটি পয়েন্টার দিতে পারেন .each_with_index.map?
মিশা মোরোশকো

1
@ মিশা: বরাবরের মতো mapএকটি পদ্ধতি Enumerableeach_with_indexযখন একটি ব্লক ছাড়া বলা হয়, একটি ফেরৎ Enumeratorবস্তু (1.8.7+ মধ্যে), যা দ্রবণ Enumerable, তাই আপনি কল করতে পারেন map, select, rejectশুধু একটি অ্যারের, হ্যাশ মত ইত্যাদি এটিতে, পরিসর ইত্যাদি
sepp2k

9
আইএমও এটি 1.8.7+ এ সহজ এবং আরও ভাল-পঠনযোগ্য:arr.map.with_index{ |o,i| [o,i+2] }
ফ্রেগজ

4
@ ফ্রোগজ: ১.৮..7 এ map.with_indexকাজ করে না ( map১.৮-এ ব্লক ছাড়াই ডাকলে একটি অ্যারে প্রদান করে)।
sepp2k

2
এটি মানা গুরুত্বপূর্ণ। মানচিত্রের সাথে কাজ করে না! যদি আপনি সরাসরি অ্যারেটিকে প্রভাবিত করতে চান তবে আপনি লুপ করছেন।
অ্যাশ ব্লু

258

রুবিতে # ইন্ডেক্স সহ উইন্ডোয়ার # রয়েছে (অফসেট = 0) , সুতরাং প্রথমে অ্যারেটি # টু_েনাম বা অ্যারে # ম্যাপ ব্যবহার করে অ্যারেটিকে একটি এনুমুলেটরতে রূপান্তর করুন :

[:a, :b, :c].map.with_index(2).to_a
#=> [[:a, 2], [:b, 3], [:c, 4]]

11
আমি বিশ্বাস করি এটি উত্তম উত্তর, কারণ এটি মানচিত্রের সাথে কাজ করবে! foo = ['d'] * 5; foo.map!.with_index { |x,i| x * i }; foo #=> ["", "d", "dd", "ddd", "dddd"]
কনার ম্যাককে

130

রুবি ১.৯.৩ তে একটি with_indexশৃঙ্খলাবদ্ধ পদ্ধতি বলা হয় যা মানচিত্রে শৃঙ্খলিত হতে পারে।

উদাহরণ স্বরূপ:

array.map.with_index { |item, index| ... }


9

এখানে পরিগণক ব্যবহার না করেই 1.8.6 (বা 1.9) এর জন্য আরও দুটি বিকল্প রয়েছে:

# Fun with functional
arr = ('a'..'g').to_a
arr.zip( (2..(arr.length+2)).to_a )
#=> [["a", 2], ["b", 3], ["c", 4], ["d", 5], ["e", 6], ["f", 7], ["g", 8]]

# The simplest
n = 1
arr.map{ |c| [c, n+=1 ] }
#=> [["a", 2], ["b", 3], ["c", 4], ["d", 5], ["e", 6], ["f", 7], ["g", 8]]

8

আমি সবসময় এই শৈলীর বাক্য গঠন উপভোগ করেছি:

a = [1, 2, 3, 4]
a.each_with_index.map { |el, index| el + index }
# => [1, 3, 5, 7]

ইনভোকিং each_with_indexআপনাকে এমন একটি এনিউরেটর পেয়েছে যা আপনি সহজেই আপনার সূচী উপলভ্য করে ম্যাপ করতে পারেন।



4

এটি করার জন্য একটি মজাদার, কিন্তু অকেজো উপায়:

az  = ('a'..'z').to_a
azz = az.map{|e| [e, az.index(e)+2]}

ঘৃণা কেন? এটি এটি করার একটি কার্যকরী উপায় এবং আমি এমনকি এটিও বলি যে ফলাফলগুলি অর্জনের একটি নির্বোধ উপায়।
অটোমেটিকো

# ইন্ডেক্সে কল করার অর্থ এটি এখন একটি হে (এন ^ 2) লুপও কেন +২? :)
রজারডপ্যাক

2
আমি যেমন লিখছি A fun, but useless way+2ওপি হ'ল আউটপুট তৈরি করা
অটোমেটিকো


1
module Enumerable
  def map_with_index(&block)
    i = 0
    self.map { |val|
      val = block.call(val, i)
      i += 1
      val
    }
  end
end

["foo", "bar"].map_with_index {|item, index| [item, index] } => [["foo", 0], ["bar", 1]]

3
ঈশ্বর! আপনি কি অন্যান্য উত্তরগুলি পড়েছেন? map.with_indexইতিমধ্যে রুবি বিদ্যমান। কেন গণ্যমান বর্গটি আবার খোলার এবং ইতিমধ্যে বিদ্যমান এমন কিছু যুক্ত করার পরামর্শ দিচ্ছেন?
নাথানভদা

এটি সম্ভবত 1.8.6 এবং 1.8.7 এ যাওয়ার সহজ উপায় হতে পারে (হ্যাঁ আমরা কেউ কেউ এখনও এটি ব্যবহার করি) এর পরিবর্তে ওয়েয়ার্ড স্টাফ each_with_index.mapইত্যাদি ব্যবহার না করে এবং এমনকি আমাদের নতুন সংস্করণগুলিতে এটি ব্যবহার করা পছন্দ করতে পারে map.with_index FWIW :)
রোজারডপ্যাক

1

আমি প্রায়শই এটি করি:

arr = ["a", "b", "c"]

(0...arr.length).map do |int|
  [arr[int], int + 2]
end

#=> [["a", 2], ["b", 3], ["c", 4]]

অ্যারের উপাদানগুলির উপরে সরাসরি পুনরাবৃত্তি করার পরিবর্তে, আপনি বহুসংখ্যক পূর্ণসংখ্যার উপর দিয়ে পুনরাবৃত্তি করছেন এবং অ্যারের উপাদানগুলি পুনরুদ্ধার করতে সূচক হিসাবে তাদের ব্যবহার করছেন।


1
আপনি যদি অন্য উত্তরগুলি পড়ে থাকেন তবে আমি আশা করি আপনি এখন বুঝতে পারেন যে আরও ভাল পন্থা রয়েছে। সুতরাং আপনাকে কেন এটি যুক্ত করার প্রয়োজন তা নিশ্চিত নয়।
নাথানভদা

যদি অ্যান্ড্রু গ্রিমের উত্তরটি দশটি ভোটের দাবিদার হয়, তবে এটি কমপক্ষে একটির প্রাপ্য!
ক্যামিল গৌডেসুন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.