Надеюсь, я правильно понял вашу проблему:
method(h[0].values_at("value"),
h[1] ? h[1].values_at("value") : []
)
Ваша проблема: если h[1]
не существует, h[1].values_at
вызовет исключение.Поэтому сначала нужно проверить, доступно ли значение.В приведенном выше фрагменте кода я использовал троичный оператор.
Расширенная версия будет иметь вид:
par2 = []
par2 = h[1].values_at("value") if h[1]
method(h[0].values_at("value"),
par2
)
В моем решении вам не нужны значения по умолчанию в определении метода.
В своем комментарии вы расширили свой вопрос.
С четырьмя параметрами вы можете использовать его следующим образом:
def method(p1,p2,p3,p4)
#...
end
method(
h[0] ? h[0].values_at("value") : [],
h[1] ? h[1].values_at("value") : [],
h[2] ? h[2].values_at("value") : [],
h[3] ? h[3].values_at("value") : [],
)
Но я бы порекомендовал более общую версию:
def method(*pars)
#pars is an Array with all values (including empty arrays.
#The next check make only sense, if you need exactly 4 values.
raise "Expected 4 values, get #{pars.size}" unless pars.size == 4
end
method( *(h.map{|i|i.values_at("x")})
И еще одна, вероятно, не очень хорошая идея:
Расширить nil (результат h[1]
, если h
не имеет этого элемента), чтобы вернуть []
для values_at:
class NilClass
def values_at(x)
[]
end
end