Ruby表达式没有评估我期待的

时间:2017-05-01 14:35:27

标签: ruby

string = "test"
suitable_inventories = [1, 2, 3]
inventories ||= string.empty? ? suitable_inventories : []   
inventories

基于我对Ruby的理解,我期待上面的代码产生:

[]

相反,它正在返回:

[1, 2, 3]

我是否误解了||=的工作原理?

2 个答案:

答案 0 :(得分:4)

||=是一项有条件的作业。以下两个基本相同:

foo ||= 42
bar = 42 unless bar

换句话说,只有当变量将||=nil作为值ATM时,false才会执行分配。由于某些特殊性,这也意味着没有分配值的变量。

因此,如果inventories已经拥有某个数组,则不会使用||=重新分配新数组。

答案 1 :(得分:3)

a ||= b表示a || a = b,即

  • 如果设置了a(不是nilfalse),那么使用a运算符
  • 的短路行为||保持不变
  • 否则,a将为false或nil,导致在||之后执行第二部分表达式,即a=b

在您的情况下,inventories必须已经分配(而不是nil),这就是为什么它不是[]

inventories ||= string.empty? ? suitable_inventories : [] 

相当于:

inventories || inventories = string.empty? ? suitable_inventories : []