Добавить элемент в массив в Ruby, даже если переменная не существует

У меня есть следующее:

foo ||= []
foo << "bar"

И я уверен, что это можно сделать в одной строке, я просто не могу найти, как это сделать.

Важно, что foo может или не может существовать. Если он существует, он всегда является массивом, если он не существует, он должен стать массивом и добавить к нему переменную.

Ответы

Ответ 1

Вот так:

(foo ||= []) << "bar"

В скобках бит foo возвращается, если он уже существует, или создает его, если это не так, а затем добавляет <<.

Ответ 2

Если вы хотите добавить "bar", когда foo еще не определено:

foo ||= ["bar"]

если вы хотите добавить "bar", независимо от того, существует или нет foo:

(defined? foo) ? foo << "bar" : foo = ["bar"]

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

Ответ 3

Какой код вы пишете, где не уверены, существует ли локальная переменная?

Если это что-то вроде

def procedural_method(array)
  array.each do |array_item|
    result ||= []
    result << bar(array_item)
  end
  result
end

тогда вы можете попробовать более функциональный подход к программированию

def functional_programming_method(array)
  result = array.map do |array_item|
    bar(array_item)
  end
  result
end