【问题标题】:Is there a Ruby shorthand for assigning a value from an array only if it is not nil?只有当它不是零时,是否有一个 Ruby 简写来从数组中分配一个值?
【发布时间】:2015-09-09 14:56:13
【问题描述】:

我有以下代码:

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

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

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

【问题讨论】:

  • collection = json_element['COLLECTION']['$'] unless json_element['COLLECTION'].nil? 这也可以写成collection = json_element['COLLECTION']['$'] if json_element['COLLECTION'] 但我需要更多的上下文来真正理解这里的问题

标签: ruby operators


【解决方案1】:

考虑以下陈述:

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']

您询问了||=,它是abbreviated assignment 的一种形式。当 Ruby 看到 a ||= b 时,如果 anilfalse,她会分配 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

所以如果anila 仍然是nil;否则将a 设置为b

||= 的常见用法是:

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

a = [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 &amp;&amp; b 的一句话。如果anil,则a &amp;&amp; bnil。如果a 不是nil,则a &amp;&amp; bb。请注意,对于 ||&amp;&amp; 以外的运算符 opa op= b 扩展为 a = a op b

【讨论】:

    猜你喜欢
    • 2019-03-30
    • 1970-01-01
    • 2018-07-01
    • 2023-03-23
    • 2018-05-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多