在Ruby中向数组添加项,即使变量不存在

17

我有以下代码:

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

我相信这可以用一行代码实现,但我找不到方法。

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

3个回答

51

就像这样:

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

如果foo已经存在,则括号中的部分返回它,否则创建一个新的foo,然后使用<<将其附加到它。


1
这比我的答案更好。 - dbyrne

5
如果您只想在foo未定义时添加"bar"
foo ||= ["bar"]

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

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

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


我自己也刚开始学习 Ruby,所以也许我在这里漏掉了什么,但是这个代码似乎对于任何一种情况都不起作用。如果 foo 不存在,它只会被设置为 nil,在 foo 存在的情况下,也没有任何东西被添加到它里面。 - Benjamin Lindley
if (defined? foo) then foo << "bar" else foo = ["bar"] end - dbyrne
@Benjamin 你使用的 Ruby 版本是什么?我正在使用 JRuby 1.5.0。 - dbyrne
啊...我需要括号。答案已修正。 - dbyrne

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

情况是:Rails操作FooController#create必须将项目附加到“全局”会话哈希中:session[:comments] << id。不仅FooController会添加到该哈希表,而且可能还有其他控制器。现在我写下这个问题,我意识到在助手中使用getter和setter可能是更好的模式。 - berkes

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接