Rubyの真偽値
2009-07-23


なんか流行ってる?

RubyのnilCommentsAdd Star - s/.*// Rubyではif(0)はtrueルート なのかっ Cと逆だな - 独断!レビログ=偏見 2 == true が false で驚いた件- 予定は未定Blog版 bool, true and false.CommentsAdd Star - 危ないRiSKのブログ うつ期ver.

"Ruby では false または nil だけが偽で、それ以外は 0 や空文字列も含め全て真です。" が理解できていれば、特に疑問の余地は無いと思います。

irb(main):001:0> nil.to_s
=> ""
irb(main):002:0> nil.to_i
=> 0
irb(main):003:0> nil.to_a
=> []

また、#to_*系のメソッドは、レシーバをもとに指定のクラスのインスタンスを生成して返すので、戻り値の真偽がレシーバの真偽と一致しないのは、別に気にならないけどなあ。

あと、Cについては、もともと boolean は未定義で、"偽" == 0 だけが明確な定義で、"真"は"偽"でないもの全部ぐらいの定義だったような記憶ですが……。 (C99はちゃんと調べてないです)

その辺の流れで C/C++ で"真"と値を比較するようなコードは書いたことが無いです。

とまあ、前置きはこれぐらいで require 'php' の実装解説 - 星一の日記

Rubyの基本的なオブジェクトの == メソッドを、PHPの == 演算子の挙動に差し替えるライブラリだそうです。

こんなライブラリの実装が許されるRubyすげー(棒読み)

PHPの == が変態的なのは知っていたつもりでしたが、

PHP の == 演算子の挙動
 null、 false、 true
 
 それぞれ等価なものは以下のとおり。
 
 null
   null、false、0、NaN、空文字、空配列
 false
   null と等価なものに加えて、文字列 "0"
 true
   false と等価じゃないもの (文字列 "0.0"、"0x0"、"00" も true と等価)

"0"がfalseと等価で、 "0.0"や"00"がtrueと等価であるとは知りませんでした。 意味論的に気を利かせるなら、"0"と"0.0"は等価だと思うのですが、これって誰得?

文字列を特別扱いするにしても、awkぐらいに"その値が0か空文字列であれば偽として見なされ、それ以外の値は真であると見なされる。 "ぐらいが扱いやすいと思います。

#awkでも文字列と数字の比較は結構適当にキャストされる。

#0=="0"はtrueなのに、0はfalseで、"0"はtrueとか、遷移律は成り立たない。

[プログラム]
[Ruby]

コメント(全0件)
コメントをする


記事を書く
powered by ASAHIネット