Скажите конец цикла .each в ruby - PullRequest
79 голосов
/ 23 октября 2010

Если у меня есть цикл, такой как

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

Ответы [ 9 ]

132 голосов
/ 23 октября 2010
users.each_with_index do |u, index|
  # some code
  if index == users.size - 1
    # code for the last user
  end
end
38 голосов
/ 23 октября 2010

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

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

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

users.last.do_stuff() # code for last user
18 голосов
/ 25 октября 2012

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

users.each do |u|
  #code for everyone
  if u.equal?(users.last)
    #code for the last user
  end
end
10 голосов
/ 23 октября 2010

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

users.each_with_index do |u, i|
  if users.size-1 == i
     #code for last items
  end
end
6 голосов
/ 23 октября 2010
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
3 голосов
/ 16 сентября 2014

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

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

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

method_for_all_users users.last
method_for_last_user users.last
1 голос
/ 11 октября 2013

Другое решение состоит в том, чтобы спасти от StopItered:

user_list = users.each

begin
  while true do
    user = user_list.next
    user.do_something
  end
rescue StopIteration
  user.do_something
end
0 голосов
/ 23 июля 2013

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