考虑以下陈述:
e #=> NameError: undefined local variable or method `e'...
if false
e = 7
end
e #=> nil
f #=> NameError: undefined local variable or method `f'
f = 7 if false
f #=> nil
如您所见,如果查找局部变量(e 或 f)的值,Ruby 会引发异常,但如果该变量首先出现在语句中,但没有赋值,Ruby 会设置它的值值nil。我们看到:
a = b unless c.nil?
等同于:
a = b if c
等同于:
a = (c ? b : nil)
等同于:
a = c && b
要了解为什么最后一个表达式与前两个表达式等价,让我们尝试几个示例,两者都有:
b = 4
c = 2
c && b #=> (2 && 4) => 4
c = nil
c && b #=> (nil && 4) => nil
所以我相信你想要:
via = reminders_array[i]['value']['via'] &&
reminders_array[i]['value']['bot-input-keyword']
您询问了||=,它是abbreviated assignment 的一种形式。当 Ruby 看到 a ||= b 时,如果 a 是 nil 或 false,她会分配 a = b:
a || a = b
另外两个例子,b 仍然等于 4:
a = 2
a ||= 4 #=> a || a = 4 => a => 2 || a = 4) => 2
a = nil
a ||= 4 #=> a || a = 4 => a => nil || a = 4 #=> 4
所以如果a 是nil,a 仍然是nil;否则将a 设置为b。
||= 的常见用法是:
a = nil
(a ||= []) << 4
#=> [4]
a = [4]
(a ||= []) << 6
#=> [4,6]
首先,a 是nil,所以a ||= [] 将a 转换为一个空数组,并附加4。在第二种情况下,a([4])不是nil,所以a ||= [] 保持a 不变([4])。然后将6 附加到a,使a [4,6]。
除了||=还有:
a &&= b #=> a && a = b
a += b #=> a = a + b
a *= b #=> a = a * b
和其他人(请参阅文档)。关于a && b 的一句话。如果a 是nil,则a && b 是nil。如果a 不是nil,则a && b 是b。请注意,对于 || 和 && 以外的运算符 op,a op= b 扩展为 a = a op b。