@ kimmo-letho answer - отлично (вторая часть, где условие фактически изменено.
Я бы добавил более идиоматическую версию, просто ради полноты, а также потому, что добавить код в комментарии нелегко.
array.each do |item|
x, _ = item
case
when x.nil?
item[1] = false
when x.respond_to?("string")
item[1] = 'it is a string'
end
end
С другой стороны, у меня сложилось впечатление, что вы создаете массив [x, true]
вручную перед циклом. Если все, что вам нужно, это напечатать (или вернуть) предметы, которые имеют истинное состояние, вы можете сделать лучше:
# xs => [x1, x2, x3, ...]
# where your original array was [[x1, cond1], [x2, cond2], ...]
xs.reject do |x|
x.nil? || x.respond_to?("string") || x+y[x] == 4
end
Если у вас уже было какое-то ложное состояние, и вы хотите сохранить предыдущее:
# array => [[x1, cond1], [x2, cond2], ...]
array.map do |x, cond|
[x, cond && !(x.nil? || x.respond_to?("string") || x+y[x] == 4)]
end