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とか、遷移律は成り立たない。

コメント

コメントをどうぞ

※メールアドレスとURLの入力は必須ではありません。 入力されたメールアドレスは記事に反映されず、ブログの管理者のみが参照できます。

※なお、送られたコメントはブログの管理者が確認するまで公開されません。

名前:
メールアドレス:
URL:
コメント:

トラックバック

このエントリのトラックバックURL: http://dragonstar.asablo.jp/blog/2009/07/23/4450893/tb

※なお、送られたトラックバックはブログの管理者が確認するまで公開されません。