標籤:sp strong on 資料 bs 代碼 as 工作 nbsp
平時我們在寫代碼,構造嵌套資料或者給某個變數初始化時會用到下面這種形式:
a ||= [] ; a = b || c ; a = a || []
這種形式可以保證,在這些變數要被訪問的時候才進行初始化,給我們構造資料帶來了極大的靈活性;而這就是ruby中的null 指標保護的應用。
要理解null 指標保護的工作方式,要從ruby真假值和||操作法兩方面著手:
首先,在ruby中除了nil和false被作為false外,其它值就被認為是true
其次,表面上||操作符會在兩個運算式中任何一個為true時返回true,兩個都為false時,才返回fasle;實際上在ruby中,返回的是運算式的值,如果運算式1的值不是nil或false,那麼就返回運算式1的值(被認為是true);若果運算式1的值為nil或false的話,那麼||操作符就會判定運算式2的值是否為nil或false,若不為nil或false的話則返回運算式2的值(被認為是true),否則就意味著兩個運算式的值都為nil或false,這時就返回nil或false(也就是運算式2的值)。
注意:在上面中返回的都是運算式的值,不是布爾值true或false,而是這些運算式的值被認為是false或true。
例如: if a || b #代碼block end
假設 a = "str" b為任意值,a || b 會返回a的值"str",因為a的值不是nil或false而是一個字串,所以該字串就被解譯器作為true,那麼該if條件陳述式就類似於 if true
假設 a = nil 或false b = 12.5 ,a || b會返回b的值12.5,因為a的值為nil後false,所以就會判定b的值,而b的值為12.5,所以該字串就被解譯器作為true,那麼該if條件陳述式就類似於 if true
假設 a = nil 或false b = nil 或fals ,a || b會返回b的值nil或false,而b的值就被解譯器作為false,此時if條件陳述式就類似於 if false
在看到 a = a || [] 這種寫法時也許有人會問:a在這裡沒有定義啊,會報未定義局部變數或方法的錯;其實真相是這樣的,ruby中變數的聲明和賦值是混在一起的,c = 1 就包含了變數c的聲明和變數c的賦值1,也就是說解譯器在執行到這行代碼時遇到 =號時,那麼=左邊的變數都進行了聲明(也就是聲明為變數)而此時沒有為變數賦值,所以變數的值為nil,因此會返回[].
例如:
a = 5 if false #變數定義未賦值
a # => nil
關於ruby中的null 指標保護(||=)