理解RoR(Ruby on Rails)中 nil? empty? blank?方法的區別


點擊打開原文鏈接

剛開始接觸RoR時,我經常將 nil?, empty? blank? 方法混淆,用錯. 這導致了當我在調用它們時處理條件判斷所遇到的麻煩.

而我之前對PHP, Actionscript的理解對此不僅沒有幫助,反而讓我變得更困擾. 這些語言的類似方法返回的結果與Ruby確是相反的.

我想通過一些代碼的練習,能夠加深我對這些相似方法的理解. 

先從nil?方法開始. 

.nil? 方法是對於Ruby中任意對象皆可調用的方法, 用於檢測目標對象是否存在,有效.  在條件分支語句中當你調用一個對象之前

事先對它進行有效性進行判斷是很有幫助的. Ruby中, 所有類均繼承自Object.  nil? 是來自於Object的方法, 因此除了特殊情況(

對它的重寫, 相信一般也不會這麼做), 所有類均會擁有此方法. 


爲更好理解Ruby是怎樣表示一個不存在的對象, 我們需要看一變量 nil.  在其它的語言中,同樣地被記作 NULL或null. 根據語言

對"空"的理解, NULL不會指向任何東西. Ruby恰恰在這點上與這些不同,  Ruby擁有一個真實存在的類NilClass , 所以nil有其自身的方法,

儘管這在其它語言的角度看來有些不對勁,  

nil.nil?
=> true

當我們訪問一個不存在的對象,或者正好將一個目標的值賦爲nil, 我們會得到一個NilClass的單鍵實例對象 -- nil. 見下面的幾個例子:

cool_people = {:conan_the_destroyer => "man", :red_sonja => "woman"}

cool_people[:george_bush_II]
=> nil
cool_people[:george_bush_II].class
=> NilClass
cool_people[:george_bush_II].nil?
=> true
cool_people[:conan_the_destroyer].nil?
=> false

test_var = nil
test_var.nil?
=> true

[].nil?
=> false

"".nil?
=> false

0.nil?
=> false

false.nil?
=> false



 備註
# 訪問不存在hash鍵值
# 因爲對應的key-value是在原hash中存在的, 返回false
# 這個請注意  空的對象  空數組 或者是 長度爲0的字符串 不等於nil.


下面我們來看看 empty? 



與nil?方法不同的是, empty? 僅適用於一部分Ruby對象. String類, Hash類,Array類均可以調用該方法. 當對象調用它時, 會判斷該目標是否擁有非空的值, 返回邏輯值true或false. 
["Larry", "Curly", "Moe"].empty?
=> false


[""].empty?
=> false


[].empty?
=> true


{}.empty?
=> true


"".empty?
=> true


0.empty?
=> NoMethodError: undefined method `empty?' for 0:Fixnum


test_var2 = nil
test_var2.empty?
= > NoMethodError: undefined method `empty?' for nil:NilClass




上面的最後一個例子能夠說明當們如此操作時會有什麼樣結果 (0 0 )
dog = {:name => "Beauregard"}
puts "What kind?" if dog[:breed].empty?
=> NoMethodError: undefined method `empty?' for nil:NilClass


# Use nil? instead.
puts "What kind?" if dog[:breed].nil?
=> What kind?
備註: 因爲 dog[:breed] 不存在得到nil, 而nil應該用 nil.nil? 的方式去判斷 非 .empty? 



Rails中會常用到的blank? 方法

blank?方法是Rails而非Ruby中的方法.  基本上它實現了nil? empty?的作用.  下面是來自Rails API文檔中的介紹: 
“An object is blank if it‘s false, empty, or a whitespace string.  
For example, "", " ", nil, [], and {} are blank.”
舉例來說, 我經常會在模型中賦值的場景調用blank?方法.  回想之前的例子-- dog哈希表, 我們可以這樣來簡化檢驗值
script/console >>


dog = {:name => "Beauregard"}
puts "What kind?" if dog[:breed].blank?
=> What kind?


dog = {:name => "Beauregard", :breed => ""}
puts "What kind?" if dog[:breed].blank?
=> What kind?





可以看到 .blank? 的結果 相當於 .ni?  +   .empty?
如果還有哪裏不夠清楚,請與我討論:)Let me know if I missed anything.



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章