Скажите конец. каждый цикл в 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


спасибо

562   9  

9 ответов:

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

Если это либо/или ситуация, где вы применяете некоторый код ко всем но последнего пользователя, а затем какой-то уникальный код только последний пользователь, одно из других решений может быть более подходящим.

однако, похоже, вы используете один и тот же код для всех пользователей, а некоторые дополнительные код для последнего пользователя. Если это так, то это кажется более правильным, и более четко заявляет о своем намерении:

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

иногда я считаю, что лучше разделить логику на две части, одну для всех пользователей и одну для последнего. Поэтому я бы сделал что-то вроде этого:

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

method_for_all_users users.last
method_for_last_user users.last

вы можете использовать подход @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

таким образом, вам не нужно условное!

другое решение состоит в том, чтобы спасти от 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

Comments

    Ничего не найдено.