Pertanyaan Katakan ujung loop .each di ruby


Jika saya memiliki loop seperti

users.each do |u|
  #some code
end

Di mana pengguna merupakan hash dari banyak pengguna. Apa logika kondisional termudah untuk melihat apakah Anda berada di pengguna terakhir dalam hash pengguna dan hanya ingin mengeksekusi kode tertentu untuk pengguna terakhir itu sehingga sesuatu seperti

users.each do |u|
  #code for everyone
  #conditional code for last user
    #code for the last user
  end
end

Terima kasih


75
2017-10-22 20:30


asal


Jawaban:


users.each_with_index do |u, index|
  # some code
  if index == users.size - 1
    # code for the last user
  end
end

124
2017-10-22 20:34



Jika itu adalah situasi yang baik /, di mana Anda menerapkan beberapa kode untuk semua tapi pengguna terakhir dan kemudian beberapa kode unik untuk hanya pengguna terakhir, salah satu solusi lain mungkin lebih tepat.

Namun, Anda tampaknya menjalankan kode yang sama untuk semua pengguna, dan beberapa lainnya tambahan kode untuk pengguna terakhir. Jika itu yang terjadi, ini tampaknya lebih benar, dan lebih jelas menyatakan niat Anda:

users.each do |u|
  #code for everyone
end

users.last.do_stuff() # code for last user

36
2017-10-22 20:39



Saya pikir pendekatan terbaik adalah:

users.each do |u|
  #code for everyone
  if u.equal?(users.last)
    #code for the last user
  end
end

17
2017-10-25 16:53



Apakah kamu sudah mencoba each_with_index?

users.each_with_index do |u, i|
  if users.size-1 == i
     #code for last items
  end
end

8
2017-10-22 20:35



h = { :a => :aa, :b => :bb }
h.each_with_index do |(k,v), i|
  puts ' Put last element logic here' if i == h.size - 1
end

5
2017-10-22 20:38



Terkadang saya merasa lebih baik untuk memisahkan logika ke dua bagian, satu untuk semua pengguna dan satu lagi untuk yang terakhir. Jadi saya akan melakukan sesuatu seperti ini:

users[0...-1].each do |user|
  method_for_all_users user
end

method_for_all_users users.last
method_for_last_user users.last

3
2018-04-30 09:07



Anda dapat menggunakan pendekatan @ meager juga untuk situasi / baik, di mana Anda menerapkan beberapa kode untuk semua kecuali pengguna terakhir dan kemudian beberapa kode unik hanya untuk pengguna terakhir.

users[0..-2].each do |u|
  #code for everyone except the last one, if the array size is 1 it gets never executed
end

users.last.do_stuff() # code for last user

Dengan cara ini Anda tidak perlu bersyarat!


3
2017-09-16 13:34



Solusi lain adalah untuk menyelamatkan dari StopIteration:

user_list = users.each

begin
  while true do
    user = user_list.next
    user.do_something
  end
rescue StopIteration
  user.do_something
end

1
2017-10-11 00:15