下面的代码在Ruby中是什么意思?
||=
它的语法有什么意义或原因吗?
下面的代码在Ruby中是什么意思?
||=
它的语法有什么意义或原因吗?
当前回答
如果X没有值,它将被赋值为y,否则,它将保留它的原始值,在本例中为5:
irb(main):020:0> x = 5
=> 5
irb(main):021:0> y = 10
=> 10
irb(main):022:0> x ||= y
=> 5
# Now set x to nil.
irb(main):025:0> x = nil
=> nil
irb(main):026:0> x ||= y
=> 10
其他回答
这个问题在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
都有不同的待遇。
这是默认的赋值表示法
例如:x ||= 1 这将检查x是否为nil。如果x确实为nil,那么它就会赋给它一个新值(在我们的例子中是1)
更明确的表示: 如果x == nil X = 1 结束
A ||= b
表示如果'a'中存在任何值并且您不想更改它,则继续使用该值,否则如果'a'没有任何值,则使用'b'的值。
简单的话,如果左手边不为空,则指向现有的值,否则指向右边的值。
还请记住||=不是原子操作,因此,它不是线程安全的。根据经验,不要将它用于类方法。
除非x X = y 结束
除非x有值(不是nil或false),否则将其设为y
等于
X ||= y