RubyとObjective-C(C言語)のゼロ判定の違いについて
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
--------------------
まとめ
ちゃんと頭切り替えてやらないと思わぬところでつまずいてしまう。。。
そもそも最初のコードみたいな書き方をしないのが懸命なんでしょうけど。