Ruby:使用|| =运算符应该能够在'if'语句中重写,但它似乎不起作用。

时间:2015-04-13 04:40:04

标签: ruby memoization

我相信这句话说"如果school[grade]为真,那么就把name铲进去。如果它是假的,那么给它一个值[],然后将name铲入其中:

(@school[grade] || @school[grade] = []) << name

如果是,那么这应该等同于以下几行:

if @school[grade] == true 
  @school[grade] << name
else 
  @school[grade] = []
  @school[grade] << name
end

但它似乎没有成功。我无法弄清楚我在这里失踪了什么。

2 个答案:

答案 0 :(得分:1)

x == true检查x是否等于true,而不是x是否真实(这是一个数组)。使用if @school[grade]

irb(main):001:0> !!5
=> true
irb(main):002:0> 5 == true
=> false

答案 1 :(得分:1)

在Ruby中nil为false,非nil(除false之外)为真。所以这是一个更好的翻译:

if @school[grade]           # if @school[grade] isn't nil or false
  @school[grade] << name    # append name to it
else 
  @school[grade] = []       # otherwise give it an empty array
  @school[grade] << name    # and then append name to it
end

else子句可以缩减为一行:@school[grade] = [name]