天天看點

《Effective Ruby:改善Ruby程式的48條建議》一第1條:了解Ruby中的True

本節書摘來自華章出版社《effective ruby:改善ruby程式的48條建議》一書中的第1章,第1.1節,作者[美]彼得 j.瓊斯(peter j. jones),更多章節内容可以通路雲栖社群“華章計算機”公衆号檢視

似乎每門語言處理布爾值都有其自己的方式。有些語言僅有一種真假值的表示方法。其他語言使用令人困惑的多種類型來表示,它們時真時假。當對條件表達式的真假值判斷錯誤時會導緻程式錯誤。比如,你知道有多少語言用零值表示假嗎?零值為真的語言又有哪些呢?

ruby有自己的做事方式,包括布爾值。幸好,差別真假值的規則非常簡單。因為它不同于其他語言(這也是寫這一條的原因),是以請确認你了解了以下内容。在ruby中,除了false和nil,其他值都是真值。

我們有必要花點時間來想一想這意味着什麼。這條簡單的規則相比其他主流語言顯得有些奇怪。在很多程式設計語言中,數字0表示false,而其他數字表示true。而在ruby的規則中,數字0表示true。這也許是從其他程式設計語言轉為ruby程式員時會遇到的最大的陷阱。

如果你過去熟悉的程式設計語言假設true和false是關鍵字,這将是ruby對你玩弄的另一個把戲。它們不是。事實上,true和false被描述為不遵循命名和指派規範的全局變量。也就是說,它們并不像大多數全局變量一樣以字元“$”開頭,并且不可以被作為指派語句的左半邊。不過在其他方面都可以将它們視為全局變量。你看:

《Effective Ruby:改善Ruby程式的48條建議》一第1條:了解Ruby中的True

正如你所見的,true和false的行為都和全局對象一樣,與任何對象一樣,你能夠調用它們之上的方法。(ruby也定義了true和false這種常量,它們是對這些true和false對象的引用。)同樣,它們來源于兩個類:trueclass和falseclass。兩個類中任何一種都允許你建立新的對象;你建立的對象就是true或false。如果了解ruby條件表達式的用法,你就知道true對象的存在隻是為了友善而已。因為false和nil是唯二的假值,是以用true對象表示真值是備援的,任何非false、非nil的對象都可以表示真值。

用兩個值表示假而用其他所有值表示真有時候可能造成困擾。一個常見的例子是如何差別false和nil。這在表示配置資訊的對象中會貫穿始終。這些對象中,false表示應該被禁用,而nil表示選項沒有顯式定義,因而應使用預設值。最簡單的區分方法是使用nil?方法,我會在第2條中進一步描述nil?方法。另一種方式是使用“==”操作符并将false作為左操作對象:

《Effective Ruby:改善Ruby程式的48條建議》一第1條:了解Ruby中的True

在某些語言中,形式化規則要求必須把不變量放在等号操作符的左邊。這并不是我建議把false放在“==”操作符左邊的原因。在該情況下是有功能性而非形式化原因的。将false放在左邊意味着ruby會将表達式解析為對falseclass#==方法的調用(該方法繼承自object類)。這樣我們可以很放心地知道:如果右邊的操作對象也是false對象,那麼傳回值為true。換句話說,把false置為右操作對象是有風險的,可能不同于我們的期望,因為其他類可能覆寫object#==方法進而改變這個比較:

《Effective Ruby:改善Ruby程式的48條建議》一第1條:了解Ruby中的True

當然,這樣的寫法太愚蠢了。不過在我的經驗中,這種方式發生的可能性很大。(順便提一下,我們将在第12條中多講一點“==”操作符。)

要點回顧

除了false和nil外所有值都表示真值。

和很多語言不同,ruby中的0值是真值。

如果你需要區分false和nil,可以使用nil?方法或“==”操作符并将false作為左操作對象。