在Ruby中创建或追加到数组


83
foo ||= []
foo << :element

感觉有点笨拙。还有更惯用的方法吗?


11
惯用的方式。您可以将其单行显示为(foo ||= []) << :element,但我发现它比较难看。
塞尔吉奥·图伦采夫2012年

4
IMO的正确方法是获取初始值。如果在同一方法中对同一变量具有|| =和<<,则IMO具有代码气味,并且已经做错了事。很好地询问|| = <<只是在做化妆品而不是解决实际问题。
2013年

Answers:


138
(foo ||= []) << :element

但是。保持可读性真的很麻烦吗?


39
+1表示“保持可读性真的很繁重吗?” 可读性为王。
锡人

如果foo它本身是一个更复杂的表达式,例如在其中查找值的(嵌套)哈希,这是避免多次查找值或为查找的数组值花费另一个变量的一种好方法。
sschuberth 2015年

60

您也可以始终在任何数组上使用push方法。我比较喜欢

(a ||= []).push(:element)

10

您还可以从Kernel#Array中受益,例如:

# foo = nil
foo = Array(foo).push(:element)
# => [:element]

它的优点是可以平整潜在的数组,例如:

# foo = [1]
foo = Array(foo).push(:element)
# => [1, :element]

我不确定在foo = foo设置foonilwhen的Ruby中是否总能保证它foo。而且,Kernel#Array不会变平foo。它只是返回foo一个数组。
埃里克·杜米尼尔
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.