objective-cでこんなコードを書いた時

int flg = 0;
if(flg) {
    // ...
}

C言語の特性上、intのゼロはfalseとして扱われる。
そんなワケで何となく自分の中で
「0=false」が定着してしまってrubyでコード書いている時にハマってしまった。

ちょっと整理する為にrubyの判定系処理を確認するコードを書いてみた。
ruby1.9系です。

# coding: utf-8

require 'active_support/core_ext'

def judge(v)
    puts "#{v.class} : #{v}"
    mtd_arr = [:bool,:nil?,:empty?,:blank?,:present?,:zero?]
    mtd_arr.each do |mtd|
      if mtd == :bool
        puts "  bool = #{!!v}"
      else
        puts v.respond_to?(mtd) ? "  #{mtd} = #{v.method(mtd).call}" : "  #{mtd} is no method"
      end
    end
    puts "--------------------"
end

arr = [nil,"","test",0,1,[],["test"],{},{test: "testval"}]
arr.each do |v|
  judge(v)
end

結果

NilClass : 
  bool = false
  nil? = true
  empty? is no method
  blank? = true
  present? = false
  zero? is no method
--------------------
String : 
  bool = true
  nil? = false
  empty? = true
  blank? = true
  present? = false
  zero? is no method
--------------------
String : test
  bool = true
  nil? = false
  empty? = false
  blank? = false
  present? = true
  zero? is no method
--------------------
Fixnum : 0
  bool = true
  nil? = false
  empty? is no method
  blank? = false
  present? = true
  zero? = true
--------------------
Fixnum : 1
  bool = true
  nil? = false
  empty? is no method
  blank? = false
  present? = true
  zero? = false
--------------------
Array : []
  bool = true
  nil? = false
  empty? = true
  blank? = true
  present? = false
  zero? is no method
--------------------
Array : ["test"]
  bool = true
  nil? = false
  empty? = false
  blank? = false
  present? = true
  zero? is no method
--------------------
Hash : {}
  bool = true
  nil? = false
  empty? = true
  blank? = true
  present? = false
  zero? is no method
--------------------
Hash : {:test=>"testval"}
  bool = true
  nil? = false
  empty? = false
  blank? = false
  present? = true
  zero? is no method
--------------------

まとめ

ちゃんと頭切り替えてやらないと思わぬところでつまずいてしまう。。。
そもそも最初のコードみたいな書き方をしないのが懸命なんでしょうけど。