【问题标题】:what does a ||= mean in Ruby language? [duplicate]||= 在 Ruby 语言中是什么意思? [复制]
【发布时间】:2011-07-10 22:50:34
【问题描述】:

可能重复:
What does ||= mean in Ruby?

下面一行是什么意思?

a ||= {} 
a ||= 1

在 irb 中,它始终为上述两行返回 a 的类,作为哈希。 提前致谢。

【问题讨论】:

标签: ruby


【解决方案1】:

||= 是一个赋值运算符,它返回分配的值。 a ||= b 等价于声明 a || a = b ,这意味着如果设置了 a 并且具有某个真值,则它保持不变,否则它采用 b 的值。

在您的示例中,a 仅设置一次,这解释了您注意到的行为。

a ||= {} 
a ||= 1 // a is still {}

我见过的典型用法是初始化静态变量,即。

class Foo
    def self.bar
        return @bar ||= {}
    end
end

编辑:

值得一提的是||= 是一个短路运算符。这意味着在a ||= b 的情况下,只会分配a = b。在a 为非假的情况下,永远不会分配a = a。这有点迂腐,但在某些(非常)极端情况下很重要。

欲了解更多信息,read the definitive list of ||= threads and pages

【讨论】:

  • 您的示例是实例变量,而不是静态(或类)变量。那将是@@something。 [仍然是最好的答案:)]
  • @Simon 刚刚注意到同样的事情。现在已修复(虽然,不是你的方式)。
  • 它也经常用于检查-分配哈希中的东西(à-la:hash[key] ||= initial_value,特别是如果你接下来要做的是hash[key] += value,如果hash[key].nil?是真实的)。
  • @Romain 具有讽刺意味的是,这正是短路运算符这一事实很重要的极端情况。 dablog.rubypal.com/2008/3/25/a-short-circuit-edge-case
  • @Matthew 是的,这确实是在 99.9% 的情况下人们不会注意到的事情,尽管它有时会派上用场......另外,你指向的文章形式化为 @987654340 @ as x || x = a,这是我通常对 or 赋值的解释。
【解决方案2】:

意思是

a = a || {}

a = {} unless a

【讨论】:

  • 不完全是。如果 a 为 false,它还会将 a 设置为 {}。
  • 是的,我刚刚注意到,谢谢 ;-)
  • 如果它是真的,它不会分配给 a。
【解决方案3】:

你可以这样读“a ||= {}”。如果定义了“a”,则忽略右侧的表达式。否则,设置“a”等于右侧的表达式。在第一行中,“a”可能是未定义的,因此该行将“a”设置为右侧的表达式,即空哈希。在第二行,“a”已设置为 {},因此它忽略了右侧值为 1 的表达式。

【讨论】:

  • 它不是检查 a 是否被定义,而是检查 a 是否为真(例如既不假也不为零)。
  • 嗯,更准确地说...它检查“a”是否为 false、nil 或 UNDEFINED 并相应地分配“a”!
  • 对,UNDEFINED 不是真的,这是真的 :)
猜你喜欢
  • 2020-06-29
  • 2011-04-06
  • 2014-11-07
  • 2014-02-01
  • 2014-05-22
  • 2023-03-15
  • 2014-04-09
  • 2011-04-17
  • 2022-01-08
相关资源
最近更新 更多