রুবি প্রতিটি_বিহীন_ সূচক অফসেট


84

আমি কি প্রতিটি_উথ_ইন্ডেক্স লুপ আইট্রেটারে সূচকটির অফসেটটি সংজ্ঞায়িত করতে পারি? আমার সরাসরি এগিয়ে যাওয়ার প্রচেষ্টা ব্যর্থ হয়েছে:

some_array.each_with_index{|item, index = 1| some_func(item, index) }

সম্পাদনা করুন:

স্পেসিফিকেশন: আমি কোনও অ্যারে অফসেট চাই না আমি চাই যে প্রতিটি_উথ_ইন্ডেক্সের সূচকটি 0 থেকে শুরু না হয় তবে উদাহরণ 1।


আপনি কি রুবি সংস্করণ ব্যবহার করবেন?
fl00r

দুঃখিত লিখছি না জন্য, কিন্তু আমি রুবি 1.9.2 ব্যবহার
মার্ক

উত্তর:


110

আসলে, Enumerator#with_indexalচ্ছিক প্যারামিটার হিসাবে অফসেট গ্রহণ করে:

[:foo, :bar, :baz].to_enum.with_index(1).each do |elem, i|
  puts "#{i}: #{elem}"
end

ফলাফল:

1: foo
2: bar
3: baz

বিটিডাব্লু, আমি মনে করি এটি কেবল ১.৯.২-এ আছে।


4
1.8.7 এ এটি with_indexকোনও প্যারাম নেই, 0
সূচিগুলি

আসলে, একটি আরও ছোট উত্তর সম্ভব, নীচে আমার দেখুন।
জ্যাক Xu

50

নীচে রবির এনিউমেটর ক্লাস ব্যবহার করে সংযুক্তি দেওয়া হচ্ছে।

[:foo, :bar, :baz].each.with_index(1) do |elem, i|
    puts "#{i}: #{elem}"
end

আউটপুট

1: foo
2: bar
3: baz

অ্যারে # প্রত্যেকটি একটি করে ফেরত দেয় এবং এনুমেটরকে # বিহীন_এন্ডেক্স দিয়ে কল করলে অন্য একটি এনামুলেটরকে ফিরিয়ে দেয়, যেখানে একটি ব্লক পাস হয়।


5

1) সবচেয়ে সহজ ফাংশন index+1পরিবর্তে বিকল্প করা index:

some_array.each_with_index{|item, index| some_func(item, index+1)}

তবে সম্ভবত এটি আপনি চান না

২) পরবর্তী কাজটি আপনি করতে পারেন তা হ'ল jব্লকের মধ্যে একটি আলাদা সূচক সংজ্ঞায়িত করা এবং এটি মূল সূচকটির পরিবর্তে ব্যবহার করুন:

some_array.each_with_index{|item, i| j = i + 1; some_func(item, j)}

৩) আপনি যদি এভাবে প্রায়শই সূচক ব্যবহার করতে চান তবে অন্য একটি পদ্ধতি নির্ধারণ করুন:

module Enumerable
  def each_with_index_from_one *args, &pr
    each_with_index(*args){|obj, i| pr.call(obj, i+1)}
  end
end

%w(one two three).each_with_index_from_one{|w, i| puts "#{i}. #{w}"}
# =>
1. one
2. two
3. three


হালনাগাদ

কয়েক বছর আগে উত্তর দেওয়া এই উত্তরটি এখন অপ্রচলিত। আধুনিক রুবিসের জন্য, জ্যাক জু এর উত্তর আরও ভাল কাজ করবে।


অ্যারেতে আরও কোনও উপাদান না থাকার পরেও এটি খারাপ হয়ে যাবে
fl00r

@ fl00r সত্যিই? আমার উদাহরণে, এটি তিনটির পরে থেমে যায়।
সাভা

তবে অফসেটটি যদি 2 বা 10 হয়? আপনার ক্ষেত্রে অফসেটটি শূন্য। আমি এখানে বলতে চাচ্ছি কোন আপনার (3) মধ্যে অফসেট নেই
fl00r

@ fl00r আপনি কেবলমাত্র +1আমার কোডটি এ +2বা তে পরিবর্তন করুন +10। এটি পাশাপাশি কাজ করে।
সাওয়া

ওএমজি, লেখক তার পোস্ট সম্পাদনা করেছেন, তাই অ্যারে না করে তার সূচী অফসেটের প্রয়োজন।
fl00r


4

আমি এর মধ্যে দৌড়ে।

আমার সমাধানের প্রয়োজন নেই সবচেয়ে ভাল তবে এটি কেবল আমার পক্ষে কাজ করেছে।

ভিউ পুনরাবৃত্তিতে:

কেবল যুক্ত করুন: সূচক + 1

এগুলি আমার জন্য সমস্ত, কারণ আমি এই সূচক সংখ্যার কোনও রেফারেন্স ব্যবহার করি না তবে কেবল একটি তালিকায় দেখানোর জন্য।


3

হ্যা, তুমি পারো

some_array[offset..-1].each_with_index{|item, index| some_func(item, index) }
some_array[offset..-1].each_with_index{|item, index| some_func(item, index+offset) }
some_array[offset..-1].each_with_index{|item, index| index+=offset; some_func(item, index) }

ইউপিডি

এছাড়াও আমার খেয়াল করা উচিত যদি অফসেটটি আপনার অ্যারের আকারের চেয়ে বেশি হয় তবে এটি ত্রুটিযুক্ত। কারণ:

some_array[1000,-1] => nil
nil.each_with_index => Error 'undefined method `each_with_index' for nil:NilClass'

আমরা এখানে কি করতে পারি:

 (some_array[offset..-1]||[]).each_with_index{|item, index| some_func(item, index) }

বা অফসেট প্রিফিকেট করতে:

 offset = 1000
 some_array[offset..-1].each_with_index{|item, index| some_func(item, index) } if offset <= some_array.size

এটি সামান্য হ্যাকি

ইউপিডি 2

যতদূর আপনি আপনার প্রশ্ন আপডেট করেছেন এবং এখন আপনার আরে অফসেটের দরকার নেই, তবে সূচি অফসেট তাই @ সাওয়া সমাধান আপনার পক্ষে ভাল কাজ করবে


1

এরিয়েল ঠিক আছে। এটি এটি পরিচালনা করার সেরা উপায় এবং এটি খুব খারাপ নয়

ary.each_with_index do |a, i|
  puts i + 1
  #other code
end

এটি পুরোপুরি গ্রহণযোগ্য, এবং আমি এর জন্য দেখেছি বেশিরভাগ সমাধানের চেয়ে ভাল। আমি সবসময় ভাবতাম # ইন্জেক্টটি হ'ল এটি ... ওহ ভাল।


1

আরেকটি পন্থা ব্যবহার করা হয় map

some_array = [:foo, :bar, :baz]
some_array_plus_offset_index = some_array.each_with_index.map {|item, i| [item, i + 1]}
some_array_plus_offset_index.each{|item, offset_index| some_func(item, offset_index) }

1

এটি প্রতিটি রুবি সংস্করণে কাজ করে:

%W(one two three).zip(1..3).each do |value, index|
  puts value, index
end

এবং জেনেরিক অ্যারে জন্য:

a.zip(1..a.length.each do |value, index|
  puts value, index
end

দ্বিতীয় উদাহরণে একটি বন্ধনী অনুপস্থিত।
ওয়েফারথিন

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