将元素附加到可能尚未初始化的数组中的Ruby习惯用法是什么



我发现<<不能被Array使用,除非它已经初始化。我现在这样写:

unless @app
 @app = my_array
else
 @app << my_array
end 

有更好的写法吗?

我以前用过||=,但

(@app ||= []) << [1,2,3]

将返回[[1,2,3]],这不是我们想要的。我们想要[1,2,3]

您可以在此处使用快捷方式

(@app ||= []) << xxx

编辑:

如果您想将数组推送到@app变量,那么使用concat是一个更好的选择:

(@app ||= []).concat [1, 2, 3]
(@app ||= []).concat [4, 5, 6]
@app # => [1, 2, 3, 4, 5, 6]

或者,您也可以使用splat运算符,如@ck3g所建议的那样。

> (@app ||= []).push *[1, 2, 3]
=> [1, 2, 3]

*是"一元"运算符。

> array = [1, 2, 3]
=> [1, 2, 3]
> [*array]
=> [1, 2, 3]

方法<<push的不同之处在于push可以接受多个参数。

这也适用于单一值:

> (@app2 ||= []).push *1
=> [1]

也许您正在使用<lt;错了吗<lt;是指数组的一个元素,而不是数组的一块。

@app ||= []
@app.concat my_array 

这里有一个成语:

@app ||= []
@app << xxx

最新更新