web-dev-qa-db-ja.com

.eachループの終わりをruby

次のようなループがある場合

users.each do |u|
  #some code
end

ユーザーは複数のユーザーのハッシュです。あなたがユーザーハッシュの最後のユーザーにいて、その最後のユーザーのために特定のコードだけを実行したいのかどうかを確認する最も簡単な条件付きロジックは何ですか

users.each do |u|
  #code for everyone
  #conditional code for last user
    #code for the last user
  end
end
79
Splashlin
users.each_with_index do |u, index|
  # some code
  if index == users.size - 1
    # code for the last user
  end
end
135
Raphomet

いずれかまたは両方の状況で、すべてのコードにすべてのコードを適用している場合but最後のユーザーと、その後にonly最後のユーザーに一意のコードソリューションがより適切な場合があります。

ただし、すべてのユーザーに対して同じコードを実行しており、最後のユーザーに対して追加コードを実行しているようです。その場合、これはより正確に思え、より明確にあなたの意図を述べています:

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

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

最善のアプローチは次のとおりです。

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

試してみましたeach_with_index

users.each_with_index do |u, i|
  if users.size-1 == i
     #code for last items
  end
end
10
Teja Kantamneni
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
6
DigitalRoss

@meagerのアプローチは、最後のユーザーを除くすべてにコードを適用し、最後のユーザーにのみ一意のコードを適用する状況でも使用できます。

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

この方法では、条件を必要としません!

3
coderuby

ロジックを2つの部分に分けた方がよい場合があります。1つはすべてのユーザー用、もう1つは最後の部分用です。だから私はこのようなことをします:

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
xlembouras

別の解決策は、StopIterationからの救済です。

user_list = users.each

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

Rubyの一部のバージョンにはハッシュの最後の方法がありません

h = { :a => :aa, :b => :bb }
last_key = h.keys.last
h.each do |k,v|
    puts "Put last key #{k} and last value #{v}" if last_key == k
end