次のようなループがある場合
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
users.each_with_index do |u, index|
# some code
if index == users.size - 1
# code for the last user
end
end
いずれかまたは両方の状況で、すべてのコードにすべてのコードを適用している場合but最後のユーザーと、その後にonly最後のユーザーに一意のコードソリューションがより適切な場合があります。
ただし、すべてのユーザーに対して同じコードを実行しており、最後のユーザーに対して追加コードを実行しているようです。その場合、これはより正確に思え、より明確にあなたの意図を述べています:
users.each do |u|
#code for everyone
end
users.last.do_stuff() # code for last user
最善のアプローチは次のとおりです。
users.each do |u|
#code for everyone
if u.equal?(users.last)
#code for the last user
end
end
試してみましたeach_with_index
?
users.each_with_index do |u, i|
if users.size-1 == i
#code for last items
end
end
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
@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
この方法では、条件を必要としません!
ロジックを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
別の解決策は、StopIterationからの救済です。
user_list = users.each
begin
while true do
user = user_list.next
user.do_something
end
rescue StopIteration
user.do_something
end
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