[ Ruby ] nil?, empty?, blank?, present?, any? methods

在 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?
=> false
nil.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
  • 集合中的元素只要不是 nilfalse 則會回傳 true
  • block 回傳的值只要不是 nilfalse 則會回傳 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