Добавить элемент в массив в Ruby, даже если переменная не существует - PullRequest
14 голосов
/ 09 марта 2011

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

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

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

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

Ответы [ 3 ]

44 голосов
/ 09 марта 2011

Вот так:

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

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

4 голосов
/ 09 марта 2011

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

foo ||= ["bar"]

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

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

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

2 голосов
/ 10 марта 2011

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

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

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

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

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