關於ruby中的null 指標保護(||=)

來源:互聯網
上載者:User

標籤: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 指標保護(||=)

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.