是否有一个Ruby简写,只有当它不是nil时才从数组中赋值?

时间:2015-06-23 17:03:19

标签: ruby operators

我有以下代码:

via = reminders_array[i]['value']['bot-input-keyword'] unless reminders_array[i]['value']['via'].nil?

collection = json_element['COLLECTION']['$'] unless json_element['COLLECTION'].nil?

当我搜索示例时,我看到人们使用||=但我无法理解它的用法,尤其是在第二种情况下。

1 个答案:

答案 0 :(得分:0)

考虑以下陈述:

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 

如您所见,如果寻求局部变量(ef)的值,但是如果变量首先出现在语句中但未赋值,则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']

你问过||=a ||= b的简写

a = a || b

当Ruby看到a ||= b时,她会在做任何其他事情之前将其转换为a = a || b

另外两个示例,b仍然等于4

a = 2
a ||= 4 #=> a=(a || 4) => a=(2 || 4)   #=> 2

a = nil
a ||= 4 #=> a=(a || 4) => a=(nil || 4) #=> nil

因此如果anil,则a仍为nil;其他a设置为b

||=的常见用法是:

a = nil
(a ||= []) << 4
  #=> [4]
(a ||= []) << 6
  #=> [4,6]

在第一个实例中,anil,因此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的一句话。如果anil,则a && bnil。如果a不是nil,则a && bb