Day09 -超级经典面试题:Ruby的a ||= b(or-equals)是什么意思呢?

前情提要:c++

写了这一系列下来,发现Ruby有许多特别的方法。前几天提到String字串,而且接续着在第八天咱们了解串接(concatenate)与插入interpolation#{}方法(就连加号+也是方法之一呢!!!)今天要来研究新的字串与数值比较的条件指定表达式(conditional assignment operator)啰!面试

Ruby经典面试题目#09(chao-ok-huangdaoyi)ruby

请解释Explain this ruby idiom(or-equals):a ||= b?ide

解答:若是a还没有被初始化,或是为falsy(空值nil或false),a等于b;
其余状况下,a值不变。this

If a is not initialized(or if it is set to nil or false),set it with the value of b.google

让咱们来看下列的表达式:
指定a的值为1,所以非nil或false。
a通过||=(or-equals)的方法判断,值仍维持不变a=1:lua

例子Aidea

a = false
b = nil
p a ||= b #a本来为false,印出a=nil
例子Bget

a = nil
b = true
p a ||= b #a本来为nil,印出a=true
例子Cit

a = 1
b = 2
puts a ||= b #a已指定值,印出a=1
看起来很简单的题目,为何特意单独挑一天说明呢?由于其实这个or-equals缩写,背后大有玄机!

这边想特别指出是,a ||= b为a || a = b的缩写:

a || a = b
---------------
a?a:a = b #or eqauls
---------------
if a then a
else a = b
end
若是a没有被初始化,或是为空值nil或false,a等于b;
其余状况下,a值不变。

注意,a ||= b并不是a = a || b的缩写,让咱们来比较一下语法含义:

a = a || b
---------------
a = a?a:b
---------------
if a then
a = a
else
a = b
end
在(if a then a = a)这个语法上,a已经被比较过两次(it is evaluated twice),是否是就没这么简洁与精确了呢?

所以,虽然这两个缩写印出来都会是a = 1。但意思是很不同的。

a = 1
b = 2

puts a ||= b #a=1
puts a || b = b #a=1
puts a = a || b #a=1

(在c++程序里a += b是a = a + b的缩写,但Ruby不是C++,详见Ruby Forum在2008年时这里的讨论串)

若是以拟人化的方式解释,我会说a是在「成为本身的过程」。
若是a的内心没有idea(梦想)还没有被初始化,或者什么想法都没有(nil)或是负面想法太多(false),
a就会被b影响,变成为b。

我相信咱们最终,都不想成为别人,只想成为本身(xcsjbj)。

Be Yourself.Everyone Else is Already Taken.
就像Ruby之因此成为Ruby同样的特别,由于它语法上的创新与简洁,是其余程序无可取代的。

感想:
为了找这一篇题目的解答,查询很多数据,发现(10年前)google mail list上几位Ruby前辈们争辩关于这个问题的讨论串,还蛮感动的!

这或许就是追求知识源头、逼近真实的过程吧!:)

相关文章
相关标签/搜索