Сообщите конец цикла .each в рубине

Если у меня есть петля, такая как

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

Спасибо

Ответ 1

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

Ответ 2

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

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

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

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

Ответ 3

Я думаю, что лучший подход:

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

Ответ 4

Вы пробовали each_with_index?

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

Ответ 5

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

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

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

method_for_all_users users.last
method_for_last_user users.last

Ответ 7

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

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

Ответ 8

Нет никакого последнего метода для хеша для некоторых версий 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

Ответ 9

Другим решением является спасение от StopIteration:

user_list = users.each

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