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前輩們爭辯關於這個問題的討論串,還蠻感動的!

這或許就是追求知識源頭、逼近真實的過程吧!:)

相關文章
相關標籤/搜索