Я бы налегал на методы, которые Enumerable
и Object
дают вам.Из Enumerable
мы можем использовать select
для выбора только тех элементов массива, которые удовлетворяют некоторому условию.Это условие состоит в том, что по крайней мере одна из переменных экземпляра не является nil
, и для этого мы можем использовать any?
.
С Object
мы будем использовать instance_variables
, чтобы получить коллекцию переменных экземпляраи мы получим доступ к значению этих переменных экземпляра с помощью instance_variable_get
.
Это будет выглядеть примерно так:
filtered_array = array.select do |object|
object.instance_variables.any? { |var| object.instance_variable_get(var) }
end
Конечно, any?
эффективен в том, что он остановитсяитерации и верните true в самой первой «истинной» переменной.По предложению SteveTurczyn, если вам нужно только проверить последнее значение, это еще быстрее.
filtered_array = array[0..-2] if array[-1].instance_variables.none? { |var| object.instance_variable_get(var) }