[Ruby] nil?, empty?, blank?, present?, any? methods
Published in
4 min readJul 30, 2018
在 Ruby on Rails 學習和實作專案的過程中,發現了很多功能相似卻又分不清差異的方法。就好比 nil?
、 empty?
與 blank?
或 present?
、 any?
與 exists?
。趁這個機會好好來搞懂之間差異吧!
nil?
- 是 Ruby method
- 可以被任何物件使用的方法
- 只要物件是 null,使用
nil?
皆會回傳true
nil.nil?
=> true
empty?
- 是 Ruby method
- 可以用在 string, array 或 hash 的方法
- 只要 string, array 或 hash 的 length 為 0 則會回傳
true
- 用在 NilClass 時會報錯
NoMethodError
[].empty?
=> true{}.empty?
=> true"".empty?
=> true" ".empty?
=> falsenil.empty?
=> NoMethodError: undefined method `empty?' for nil:NilClass
blank?
- 是 Rails method (in ActiveSupport)
- 與 Ruby 的
empty?
一樣可以用在 string, array 或 hash 的方法 - 但 type 為 string 的物件若為空白時,
blank?
會回傳true
- 使用在 NilClass 時會不會報錯,會回傳
true
nil.blank?
=> true" ".blank?
=> true"\n".blank?
=> true[""].blank?
=> flase[].blank?
=> true[nil].blank?
=> false
present?
- 是 Rails method (in ActiveSupport)
- 與
blank?
相反的方法 !obj.blank? == obj.present?
nil.present?
=> false" ".present?
=> false"\n".present?
=> false[""].present?
=> true[].present?
=> false[nil].present?
=> true
any?
- 是 Rails method
- 集合中的元素只要不是
nil
或false
則會回傳true
- block 回傳的值只要不是
nil
或false
則會回傳true
[nil, false].present? => true
vs[nil, false].any? => false
[3, 8, 42].any? { |e| e > 10 }
=> true[3, 8, 42].any? { |e| e < 2 }
=> false[3, 8, 42].any?
=> true[].any?
=> false[nil].any?
=> false[false].any?
=> false[nil, false].any?{ |e| e == nil }
=> true"".any?
=> NoMethodError: undefined method `any?' for "":String