||= 在 Ruby 语言中是啥意思? [复制]
Posted
技术标签:
【中文标题】||= 在 Ruby 语言中是啥意思? [复制]【英文标题】: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 的类,作为哈希。 提前致谢。
【问题讨论】:
@mladen 没错,但我个人会投票结束另一个问题,支持这个问题。这个在评分最高的答案中有更多最新/正确的信息。 重复:What does||=
mean in Ruby?、What does ||=
mean in Ruby?、what is ||=
in ruby?、Double Pipe Symbols in Ruby Variable Assignment?、What does the “||=
” operand stand for in ruby、Is the ruby operator ||=
intelligent? 可能还有很多其他的。
另见The definitive list of ||=
(OR Equal) threads and pages。 What does ||=
mean in Ruby? 和 What does ||=
mean in 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 不是真的,这是真的 :)以上是关于||= 在 Ruby 语言中是啥意思? [复制]的主要内容,如果未能解决你的问题,请参考以下文章
波浪号大于 (~>) 在 Ruby gem 依赖项中是啥意思? [复制]