@ users.each do | user | --- Есть ли способ сделать это для нескольких объектов - PullRequest
4 голосов
/ 08 мая 2011

Я сейчас делаю:

@users.each do |user|

Учитывая, что у меня есть @users, @ users1, @ users2

Есть ли способ сделать:

[@users, @users1, @users2].each do |user|

Каждый цикл проходит через все объекты?

Спасибо

Ответы [ 3 ]

10 голосов
/ 08 мая 2011

Вы можете объединить массивы и повторить результат:

(@users + @users1 + @users2).each do |user| 
  ...
end

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

users, users1, users2 = [1,2],  [ [3,4], [5,6] ], [ 7,8]
puts [users,users1,users2].flatten.inspect
# Will print [1, 2, 3, 4, 5, 6, 7, 8]
# Two small arrays are smashed!!!

Однако, как указывает jleedev в одном из комментариев, функция flatten в Ruby может принимать целочисленный аргумент, определяющий максимальный уровень, на который массивы будут разбиваться, поэтому:

puts [users,users1,users2].flatten(1).inspect
# Will print [1, 2, [3, 4], [5, 6], 7, 8]
# Just as planned.
3 голосов
/ 08 мая 2011

Различные техники:

# Concatenate
(@users+@users1+@users2).each{ ... }

# Splat (Ruby 1.9 only)
[*@users,*@users1,*@users2].each{ ... }

# Interleave them
@users.zip( @users1, @users2 ).each{ |u,u1,u2| ... }
3 голосов
/ 08 мая 2011
[@users,@users1,@users2].flatten.each do |user|
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...