প্রত্যেকের জন্য রুবিতে স্বয়ংক্রিয় কাউন্টার?


134

আমি প্রতিটি এবং একটি কাউন্টার ব্যবহার করতে চাই:

i=0
for blah in blahs
    puts i.to_s + " " + blah
    i+=1
end

এটা করতে একটি ভাল উপায় আছে কি?

দ্রষ্টব্য: আমি জানি না blahsএকটি অ্যারে বা হ্যাশ কিনা , তবে করণীয় blahs[i]এটি এতো বেশি যৌনপরী করে তুলবে না। এছাড়াও আমি জানতে চাই i++রুবিতে কীভাবে লিখবেন ।


প্রযুক্তিগতভাবে, ম্যাটস এবং স্কেগির উত্তরটি প্রথমে এসেছিল তবে আমি প্যারাডোজার সেরা উত্তর দিচ্ছি তাই পয়েন্টগুলির চারপাশে কিছুটা ছড়িয়ে পড়ে এসও-তে। এছাড়াও তার উত্তরে সংস্করণগুলি সম্পর্কে নোট ছিল, যা এখনও প্রাসঙ্গিক (যতক্ষণ না আমার উবুন্টু 8.04 রুবি 1.8.6 ব্যবহার করছে)।


ব্যবহার করা উচিত puts "#{i} #{blah}"যা অনেক বেশি সংযোগযুক্ত।


রুবিতে কোনও ইনক্রিমেন্ট অপারেটর নেই। আপনি যে এন + = 1 লিখেছেন সেটি নিকটতম সমতুল্য। এটি এন + = 1 এর জন্য সিনট্যাকটিক চিনিযুক্ত হতে হবে, যা নিজেই এন = এন + 1 এর শর্টহ্যান্ড। ++ এর ধারণাটি প্রত্যাখ্যান করা হয়েছিল কারণ এটি আপনাকে ভেরিয়েবলটিকে পুনরায় নিযুক্ত করছেন এই বিষয়টি গোপন করে। rubyurl.com/Dsb1
চক

নিস! ধন্যবাদ চক আমি জাভাতে ++ i এবং i++ শিখতে বাধ্য হয়েছিলাম, তাই আমি কেবল ভেবেছিলাম যে এটি সর্বদা থাকবে।
ড্যান রোজনস্টার্ক

উত্তর:


190

লোকেরা যেমন বলেছে, আপনি ব্যবহার করতে পারেন

each_with_index

তবে যদি আপনি "প্রতিটি" এর চেয়ে পৃথক পৃথক সূচক চান তবে (উদাহরণস্বরূপ, আপনি যদি কোনও সূচী বা এর মতো কিছু দিয়ে মানচিত্র করতে চান) আপনি প্রতিটি_উইথ_ইন্ডেক্স পদ্ধতিতে এনুমারেটরকে যুক্ত করতে পারেন, বা কেবল_ইন্ডেক্স সহ ব্যবহার করতে পারেন:

blahs.each_with_index.map { |blah, index| something(blah, index)}

blahs.map.with_index { |blah, index| something(blah, index) }

এটি রুবি 1.8.7 এবং 1.9 থেকে আপনি কিছু করতে পারেন।


1
এটি লক্ষণীয় যে এটি 1.9 তে নতুন।
জাচ ল্যাংলি 20

1
ভাল বিক্ষোভ. প্রকৃতপক্ষে, এটি 1.8.7 এও রয়েছে তবে এটি যুক্ত করার মতো কিছু।
প্যারাডোজা

আমি কেবল রুটি ১.৮..6 এ থাকি যদি আমি কেবল উবুন্টুতে পুরো জিনিসটি ইনস্টল করি? 1.8.7 পরীক্ষামূলক / বিটা হয়?
ড্যান রোজনস্টার্ক

আপনি কোন উবুন্টু ব্যবহার করছেন? ইন্ট্রিপিডে 1.8.7 আছে। এটা গত স্থিতিশীল সংস্করণ (এর ruby-lang.org/en/downloads )। তবে, আপনি একই রকম আচরণ করতে রুবি ১.৮..6 প্যাচ করতে পারেন (দেখুন কড়াকড়িভাবে টাইপড করুন / ২০০৮ / ০৯ / রবি -১8787 এস-সংখ্যক- শ্রেণি। Html )।
প্যারাডোজা

3
বিতরণ পিছনে থাকায় আমি ক্লান্ত হয়ে পড়েছি তাই আমি উবুন্টু এবং লিনাক্স মিন্টে আমার রুবি ইনস্টলেশন পরিচালনা করতে rvm ব্যবহার শুরু করি।
টিন ম্যান

55
[:a, :b, :c].each_with_index do |item, i|
  puts "index: #{i}, item: #{item}"
end

আপনি এটির জন্য এটি করতে পারবেন না। আমি সাধারণত ব্যক্তিগতভাবে যাইহোক প্রত্যেককে আরও ডিক্লেটিভ কল পছন্দ করি। আংশিক কারণ সিনট্যাক্সের জন্য সীমাটির সীমাটি হিট করার পরে এটি অন্য রূপগুলিতে রূপান্তর করা সহজ।


সুন্দর, আমি সিনট্যাক্সের সাথে সীমাবদ্ধতা সম্পর্কে পয়েন্টটি দেখছি। আমাকে একাধিক পরামিতিগুলির সাথে ব্লক করতে অভ্যস্ত হতে হবে।
ড্যান রোজনস্টার্ক

11

হ্যাঁ, এটি collection.eachলুপগুলি করতে হবে এবং তারপরে each_with_indexসূচকটি পেতে হবে।

আপনার সম্ভবত একটি রুবি বই পড়া উচিত কারণ এটি মৌলিক রুবি এবং যদি আপনি এটি জানেন না, তবে আপনি বড় সমস্যায় পড়তে চলেছেন (চেষ্টা করুন: http://poignantguide.net/ruby/ )।

রুবি উত্স কোড থেকে নেওয়া:

 hash = Hash.new
 %w(cat dog wombat).each_with_index {|item, index|
   hash[item] = index
 }
 hash   #=> {"cat"=>0, "wombat"=>2, "dog"=>1}

সমস্যা নেই, সাহায্য করে খুশি। .Ech ব্লকটি সম্পর্কে "গড়" হওয়ার অর্থ ছিল না - এগুলি মৌলিক রুবি নির্মাণ এবং ফ্লাইতে এগুলি শিখানো সত্যিই, বেদনাদায়ক হবে। :) বুলেট কামড়ানোর জন্য এবং কয়েক ঘন্টা পড়তে ব্যয় করা ভাল!
ম্যাট রোগিশ

6

আপনার যদি নতুন সংস্করণ না থাকে তবে each_with_indexআপনি zipউপাদানগুলির সাথে সূচীগুলি জুড়তে পদ্ধতিটি ব্যবহার করতে পারেন :

blahs = %w{one two three four five}
puts (1..blahs.length).zip(blahs).map{|pair|'%s %s' % pair}

যা উত্পাদন করে:

1 one
2 two
3 three
4 four
5 five

1
'%s %s' % [1, "two"]রুবি ডক্সে আপনার উত্তর থেকে আমি এই কোডটি কোথায় পাব? জিপ এবং ম্যাপিংয়ের জন্য একটি লাইন ব্যবহার করে আপনার সহায়তার জন্য এবং উল্লম্ব স্থান সংরক্ষণ করার জন্য ধন্যবাদ।
ড্যান রোজনস্টার্ক 19:51

1
এই প্রসঙ্গে,%-সাইন অপারেটর স্ট্রিং ক্লাসের একটি পদ্ধতি। আপনি এটি সম্পর্কে ruby-doc.org/core/classes/String.html#M000770 এ পড়তে পারেন । অথবা আপনি কমান্ড প্রম্পটে রি স্ট্রিং #% টাইপ করতে পারেন। অথবা আপনি যে ডকুমেন্টেড ক্লাসটি সনাক্ত করেছেন তার সবগুলি দেখতে আপনি রি% টাইপ করতে পারেন, যেমন, রি ফিকনাম #% তে আরও পরিচিত অর্থ।
জর্জ

4

করার বিষয়ে আপনার প্রশ্ন হিসাবে i++, ভাল, আপনি রুবিতে এটি করতে পারবেন না। i += 1এ বক্তব্যে আপনি কি ছিল ঠিক কিভাবে আপনি এটা করবেন অনুমিত করছি।



1

যদি blahsএকটি শ্রেণি হয় যা গণনার সাথে মিশে যায় তবে আপনার এটি করা উচিত:

blahs.each_with_index do |blah, i|
  puts("#{i} #{blah}")
end

1

আপনি যদি প্রতিটিটির জন্য রুবির সূচি পেতে চান তবে আপনি এটি ব্যবহার করতে পারেন

.each_with_index

কীভাবে .each_with_indexকাজ করে তা দেখানোর জন্য এখানে একটি উদাহরণ দেওয়া হল :

range = ('a'..'z').to_a
length = range.length - 1
range.each_with_index do |letter, index|
    print letter + " "
    if index == length
        puts "You are at last item"
    end
end

এটি মুদ্রণ করবে:

a b c d e f g h i j k l m n o p q r s t u v w x y z You are at last item
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.