下面的代码在Ruby中是什么意思?
||=
它的语法有什么意义或原因吗?
下面的代码在Ruby中是什么意思?
||=
它的语法有什么意义或原因吗?
当前回答
简洁完整的回答
a ||= b
计算方法与下面每一行相同
a || a = b
a ? a : a = b
if a then a else a = b end
-
另一方面,
a = a || b
计算方法与下面每一行相同
a = a ? a : b
if a then a = a else a = b end
-
编辑:正如AJedi32在评论中指出的那样,这只在以下情况下成立:A是一个已定义变量。2. 计算一次时间和两次时间不会导致程序或系统状态的差异。
其他回答
||= 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
如果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
x ||= y
is
x || x = y
"如果x为假或未定义,则x指向y"
A ||= b
表示如果'a'中存在任何值并且您不想更改它,则继续使用该值,否则如果'a'没有任何值,则使用'b'的值。
简单的话,如果左手边不为空,则指向现有的值,否则指向右边的值。
还请记住||=不是原子操作,因此,它不是线程安全的。根据经验,不要将它用于类方法。