15

我有以下内容:

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

而且我确信这可以在一行中完成,我只是找不到方法。

重要的是, foo 可能存在,也可能不存在。如果它存在,它总是一个数组,如果它不存在,它必须变成一个数组并获得一个附加到它的变量。

4

3 回答 3

49

像这样:

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

带括号的位foo如果已经存在则返回,如果不存在则创建它,然后<<附加到它。

于 2011-03-09T16:01:15.157 回答
4

如果您只想添加"bar"whenfoo尚未定义:

foo ||= ["bar"]

"bar"如果无论是否foo已经存在都想添加:

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

但是,在后一种情况下,我个人更喜欢原始代码的编写方式。当然可以在一行中完成,但我认为两行实现更具可读性。

于 2011-03-09T14:57:58.387 回答
2

您在不确定是否存在局部变量的情况下编写了什么代码?

如果是这样的

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
于 2011-03-09T22:36:30.290 回答