在 Ruby 中,空字符串""
对于条件句来说是真实的。我看到很多人都在为这个事实而苦苦挣扎。Ruby on Railsblank?
是克服这个问题的一种尝试。另一方面,当这样的规范变得方便时,并不是很明显。是否有任何用例可以让这个事实变得方便,或者如果不是这样,是否会有理论上的问题?
3 回答
我想我想出了答案。可能是出于理论原因和效率。在一个类的不同实例之间画一条线理论上比在类之间画一条线更复杂,并且需要更多的计算。如果""
是假的,那么每次条件中有一个字符串时,Ruby 内部都必须检查字符串的长度。相反,如果可以仅通过类来判断真实性(恰好是这种情况),那么效率会高得多。或许这也是false
和true
不归入单一类Boolean
而分别属于独立类的原因。
另一种可能性是 and 只有一个实例false
,nil
因此在 Ruby 内部处理它只需要检查指针/对象 id,而字符串是可变的,并且需要更复杂的检查是否为空。
减少被认为是虚假的事物的数量是一件好事。它简化了语言,简化了布尔规则,使它们更容易记住和应用,从而减少了错误。
看看 PHP 乱七八糟的:false
, 0
, 0.0
, '0'
, ''
, null
and array()
are all falsey,每天都让很多人感到惊讶。
如果要测试空字符串,请测试空字符串。您应该知道您的变量是包含字符串还是布尔值,并能够进行相应的测试。
我认为 Ruby 的设计很简单,并且具有 FEWER 的 false 值使程序更容易推理:“只有两个对象具有 false 的布尔值,它们是 false 对象本身和 nil 对象。”
权衡是你可能不得不写.blank?
更多。另一方面,有多少字段的最小长度为 1?不太多。如果您无论如何都要检查.size > 1
,那么“空字符串是真实的”是没有用的。
每种语言都选择它的“范式”。例如,在 SQL 中,布尔运算实际上有 3 个值(真、假、空)。在 Perl 和 C 中,0
是错误的。哎呀,在某些语言中,字符串“false”是错误的。