下面的代码在Ruby中是什么意思?

||=

它的语法有什么意义或原因吗?


当前回答

||= b是一个条件赋值运算符。它的意思是:

如果a是未定义的或假的,则计算b并将a设置为结果。 否则(如果定义了a并计算为真),则不计算b,并且不进行赋值。

例如:

a ||= nil # => nil
a ||= 0 # => 0
a ||= 2 # => 0

foo = false # => false
foo ||= true # => true
foo ||= false # => true

令人困惑的是,它看起来类似于其他赋值操作符(例如+=),但行为不同。

A += b转换为A = A + b ||= b大致可以转换为|| A = b

它是|| a = b的近似缩写。不同之处在于,当a未定义时,|| a = b将引发NameError,而||= b将a设置为b。如果a和b都是局部变量,这种区别不重要,但如果其中一个是类的getter/setter方法,则很重要。

进一步阅读:

http://www.rubyinside.com/what-rubys-double-pipe-or-equals-really-does-5488.html

其他回答

这个问题在Ruby邮件列表和Ruby博客上讨论得如此频繁,以至于现在Ruby邮件列表上甚至有一些线程,它们的唯一目的就是收集到Ruby邮件列表上讨论这个问题的所有其他线程的链接。

这里有一个:||= (OR Equal)线程和页面的最终列表

如果你真的想知道发生了什么,可以看看Ruby语言规范草案的第11.4.2.3节“缩写赋值”。

作为第一近似,

a ||= b

等于

a || a = b

并不等同于

a = a || b

然而,这只是一种近似,特别是在a未定义的情况下。根据是简单的变量赋值、方法赋值还是索引赋值,语义也有所不同:

a    ||= b
a.c  ||= b
a[c] ||= b

都有不同的待遇。

||= b是一个条件赋值运算符。它的意思是:

如果a是未定义的或假的,则计算b并将a设置为结果。 否则(如果定义了a并计算为真),则不计算b,并且不进行赋值。

例如:

a ||= nil # => nil
a ||= 0 # => 0
a ||= 2 # => 0

foo = false # => false
foo ||= true # => true
foo ||= false # => true

令人困惑的是,它看起来类似于其他赋值操作符(例如+=),但行为不同。

A += b转换为A = A + b ||= b大致可以转换为|| A = b

它是|| a = b的近似缩写。不同之处在于,当a未定义时,|| a = b将引发NameError,而||= b将a设置为b。如果a和b都是局部变量,这种区别不重要,但如果其中一个是类的getter/setter方法,则很重要。

进一步阅读:

http://www.rubyinside.com/what-rubys-double-pipe-or-equals-really-does-5488.html

ruby-lang语法。正确的答案是查看ruby-lang文档。所有其他解释都令人困惑。

谷歌

"ruby-lang文档缩写赋值"。

Ruby-lang文档

https://docs.ruby-lang.org/en/2.4.0/syntax/assignment_rdoc.html#label-Abbreviated+Assignment

这就像延迟实例化。 如果变量已经定义,它将获取该值,而不是重新创建该值。

一个常见的误解是,||= b并不等同于a = a || b,但它的行为就像|| a = b。

但这里有一个棘手的情况。如果a未定义,则|| a = 42将引发NameError,而||= 42将返回42。所以,它们似乎不是等价的表达式。