Ruby では、空の文字列""
は条件に関して true です。そして、この事実に苦しんでいる人をたくさん見てきました。Ruby on Railsblank?
は、この問題を克服するための 1 つの試みです。一方で、そのような仕様がいつ便利になるかはすぐにはわかりません。この事実が便利になるユースケースはありますか?それ以外の場合、理論的な問題はありますか?
3 に答える
私は答えを思いついたと思います。おそらく、それは理論的な理由と効率のためです。1 つのクラスの異なるインスタンス間に線を引くことは、理論的には、クラス間に線を引くよりも複雑であり、より多くの計算が必要になります。誤りである場合""
、Ruby の内部では、条件に文字列が含まれるたびに文字列の長さをチェックする必要があります。代わりに、たまたまそうであるクラスだけで真偽を判断できれば、はるかに効率的です。false
おそらくこれが、とtrue
が単一のクラスに含まれず、Boolean
それぞれ独立したクラスに属している理由でもあります。
別の可能性として、false
andのインスタンスが 1 つしかnil
ないため、Ruby で内部的にこれを処理するには、ポインター/オブジェクト ID をチェックするだけで済みますが、文字列は変更可能であり、空であることをチェックするにはより複雑な作業が必要になります。
虚偽と見なされるものの数を減らすことは良いことです。言語を簡素化し、ブール規則を簡素化し、覚えやすく適用しやすくし、それによってバグを減らします。
PHP が混乱しているのをfalse
見0
てください。0.0
'0'
''
null
array()
空の文字列をテストする場合は、空の文字列をテストします。変数に文字列またはブール値が含まれているかどうかを知り、それに応じてテストできる必要があります。
Ruby はシンプルになるように設計されていると思います。false の値が少ないと、プログラムは次のように推論しやすくなります。「false のブール値を持つオブジェクトは 2 つだけです。これらは false オブジェクト自体と nil オブジェクトです。」
トレードオフは、もっと書く必要があるかもしれないということです.blank?
。一方、最小長が 1 のフィールドはいくつありますか? 多くはありません。とにかくチェックしている場合.size > 1
、「空の文字列が真実である」は役に立ちません。
すべての言語は、その「パラダイム」を選択します。たとえば、SQL では、ブール演算には実際には 3 つの値 (true、false、null) があります。Perl および C では、0
false です。一部の言語では、文字列「false」は false です。