ตัวนับอัตโนมัติใน Ruby สำหรับแต่ละ?


135

ฉันต้องการใช้ for-each และ counter:

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

มีวิธีที่ดีกว่านี้ไหม

หมายเหตุ:ฉันไม่รู้ว่าblahsเป็นอาร์เรย์หรือแฮช แต่การต้องทำblahs[i]จะไม่ทำให้เซ็กซี่มากขึ้น นอกจากนี้ฉันต้องการทราบวิธีการเขียนi++ใน Ruby


ในทางเทคนิคคำตอบของ Matt และ Squeegy เกิดขึ้นก่อน แต่ฉันให้คำตอบที่ดีที่สุดสำหรับ paradoja ดังนั้นจึงกระจายไปรอบ ๆ ประเด็นใน SO นอกจากนี้คำตอบของเขายังมีหมายเหตุเกี่ยวกับเวอร์ชันซึ่งยังคงเกี่ยวข้อง (ตราบใดที่ Ubuntu 8.04 ของฉันใช้ Ruby 1.8.6)


ควรจะใช้puts "#{i} #{blah}"ที่รวบรัดกว่านี้มาก


ไม่มีตัวดำเนินการเพิ่มใน Ruby n + = 1 ที่คุณเขียนขึ้นมีค่าเทียบเท่าที่ใกล้เคียงที่สุด มันจะต้องเป็นน้ำตาลวากยสัมพันธ์สำหรับ n + = 1 ซึ่งเป็นชวเลขสำหรับ n = n + 1 แนวคิดของ ++ ถูกปฏิเสธเนื่องจากซ่อนความจริงที่ว่าคุณกำลังกำหนดตัวแปรใหม่ rubyurl.com/Dsb1
Chuck

ดี! ขอบคุณ Chuck ฉันถูกบังคับให้เรียน ++ i และ i ++ ใน Java ดังนั้นฉันแค่คิดว่ามันจะอยู่ที่นั่นเสมอ
Dan Rosenstark

คำตอบ:


192

ตามที่มีคนกล่าวไว้คุณสามารถใช้ได้

each_with_index

แต่ถ้าคุณต้องการให้ดัชนีที่มีตัววนซ้ำแตกต่างจาก "แต่ละตัว" (ตัวอย่างเช่นหากคุณต้องการแมปกับดัชนีหรืออะไรทำนองนั้น) คุณสามารถเชื่อมต่อตัวแจงนับด้วยเมธอด each_with_index หรือใช้ 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
Zach Langley

1
เห็นดี จริงๆแล้วมันก็อยู่ใน 1.8.7 เช่นกัน แต่เป็นสิ่งที่ควรค่าแก่การเพิ่ม
paradoja

ทำไมฉันถึงใช้ Ruby 1.8.6 ถ้าฉันเพิ่งติดตั้งทุกอย่างบน Ubuntu 1.8.7 ทดลอง / เบต้าหรือไม่
Dan Rosenstark

คุณใช้ Ubuntu รุ่นใดอยู่ ใน Intrepid มี 1.8.7 เป็นเวอร์ชันสุดท้ายที่เสถียร ( ruby-lang.org/en/downloads ) อย่างไรก็ตามคุณอาจใช้ Monkeypatch Ruby 1.8.6 ที่มีพฤติกรรมเหมือนกัน (ดูอย่างเคร่งครัด untyped.com/2008/09/ruby-187s-enumerator-class.html )
paradoja

3
ฉันเบื่อกับการแจกจ่ายที่อยู่เบื้องหลังดังนั้นฉันจึงเริ่มใช้ rvm เพื่อจัดการการติดตั้ง Ruby บน Ubuntu และ Linux Mint
The Tin Man

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

คุณไม่สามารถทำได้ด้วย for ฉันมักจะชอบการเรียกที่เปิดเผยมากขึ้นสำหรับแต่ละคนเป็นการส่วนตัวอยู่แล้ว ส่วนหนึ่งเป็นเพราะมันง่ายต่อการเปลี่ยนไปใช้รูปแบบอื่นเมื่อคุณถึงขีด จำกัด ของไวยากรณ์สำหรับ


ดีฉันเห็นประเด็นเกี่ยวกับขีด จำกัด ของไวยากรณ์สำหรับ ฉันต้องคุ้นเคยกับการบล็อกที่มีพารามิเตอร์หลายตัว
Dan Rosenstark

11

ใช่มันcollection.eachต้องทำลูปแล้วจึงeach_with_indexจะได้ดัชนี

คุณอาจต้องอ่านหนังสือ Ruby เพราะนี่เป็นพื้นฐานของ Ruby และถ้าคุณไม่รู้คุณจะต้องเจอกับปัญหาใหญ่ (ลอง: http://poignantguide.net/ruby/ )

นำมาจากซอร์สโค้ด Ruby:

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

ไม่มีปัญหายินดีให้ความช่วยเหลือ ไม่ได้หมายความว่าจะ "ใจร้าย" เกี่ยวกับบล็อกแต่ละบล็อก - สิ่งเหล่านี้เป็นโครงสร้างพื้นฐานของทับทิมและการเรียนรู้ได้ทันทีจะเป็นเรื่องที่เจ็บปวดจริงๆ :) ดีที่สุดที่จะกัดกระสุนและใช้เวลาอ่านไม่กี่ชั่วโมง!
Matt Rogish

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"]ในเอกสาร Ruby ได้ที่ไหน ขอขอบคุณสำหรับความช่วยเหลือและการอนุรักษ์พื้นที่แนวตั้งโดยใช้เส้นเดียวสำหรับการบีบอัดและการทำแผนที่
Dan Rosenstark

1
ในบริบทนี้ตัวดำเนินการ% -sign เป็นวิธีการของคลาส String คุณสามารถอ่านเกี่ยวกับเรื่องที่ruby-doc.org/core/classes/String.html#M000770 หรือคุณสามารถพิมพ์ ri String #% ที่พรอมต์คำสั่ง หรือคุณสามารถพิมพ์ ri% เพื่อดูคลาสเอกสารทั้งหมดที่จำได้เช่นความหมายที่คุ้นเคยมากขึ้นที่ ri Fixnum #%
จอร์จ




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.