2012-04-30 11 views
25

私は素晴らしいRuby on Rails Tutorialを読んでおり、次のコードが発生しました。Rubyで0をTrueと扱うのはなぜですか?

if 0 
    true 
else 
    false 
end 

上記戻りtrueと多くの言語(Cは明らかな例である)とは異なり、Rubyはtrueとして0を処理する方法を示します。私は、この行動を特有のものとして却下するのではなく、この重要な慣習から出発するのには正当な理由があると考えています。たとえば、Pythonでは、0Falseとして扱います。

要するに、0trueとして扱うためのルビを設計する根拠は何ですか?

答えて

52

私はMatzが「真実」という概念の単純さを欲しがっていると推測しています。唯一の「偽」値はfalsenilです。期間。

ちょうどfalseを使用するのが最もきれいですが、nilを含める必要があります。整数のゼロを特殊なケースとして含めることは、他のタイプの疑わしい真実性の精神的な洪水ゲートを開くかもしれない。文字列はどうですか?""は間違っていますか?そして配列は、[]は間違っていますか?そしてハッシュは、{}は間違っていますか?広告不具合(JavaScript参照)...

+9

私はPythonからルビに来ているので、特に興味深いのは、あなたが名前を付けた( '[]'、 '{}'、 '' "')のすべての例がPythonでは 'false'だということです。私の見解では、これはルビーの奇妙さを高めるだけです。 – enocom

+7

Ruby、Perl、JavaScript、Lua(など)を知った後にPythonを学ぶ人々は、それらの値が真実ではないことを気に入っていると確信しています。 – maerics

+2

0、[]、{}、および ""は偽ではないので、Railsは#blank ?, #present ?, #empty?を導入しました。これは、Rubyのコードの原則よりもコードを大きくします。 – allenhwkim

10

ルビーでは、存在する場合はtrueです。そうでなければ、それは間違いです。

だから、Ruby null(アドレスは割り当てられていません)とfalseは偽です。

他のすべてのものは、アドレスが割り当てられているため、真です。

私はこのように思います。 「それは存在するの?」

+4

あなたが言ったことは真実ではありません: 'nil'はオブジェクトで、' false'もあり、両方存在します:)、それらはNilClassとFalseClassのインスタンスです。偽の値は 'false'と' nil'だけです。 – jackdoe

+0

... * "except" * 'false' – DigitalRoss

+2

ok、はいすべてがrubyのオブジェクトです。 nilはNilClassクラスの唯一のインスタンスです。nullポインタを持つインスタンスを指しているので、それは本当に重要ではないと思います。私はこれを「存在しない」とみなします。 – allenhwkim

5

Common Lispでは、0も真として扱われます。たとえば、次のコードはtrueを返します。

(if 0 'true 'false) 

もちろん、RubyはLispで作成したのと同じデザインの決定に従っています。 Lispでは、空のリスト(nilで表される)だけが偽です。

関連する問題