如果空字符串是真值,那么好在哪里?

5
在Ruby中,空字符串""在条件语句中被视为真值。我看到很多人对此感到困惑。Ruby on Rails的blank?是一种解决这个问题的尝试。然而,并不容易明确何时使用此规范会更方便。是否存在任何使用此规则的情况,或者如果规则不同会有理论上的问题?

1
有没有任何使用情况,将 "" 视为假值会变得方便?我认为这更加令人惊讶。 - user229044
3
人们考虑使用 blank? 的任何地方都是使用情况,这种情况有很多。 - sawa
3
除了那些只学过JavaScript的程序员,我从未见过有人对空字符串是真值感到困惑。我认为几乎存在的每一个Ruby程序都可以将字符串视作真值的使用案例。如果您希望变量在语义上为空,您应该将其设为nil。字符串就是字符串,长度为零并不改变它的本质。 - user229044
1
“一个用例”是什么意思?每一行 Ruby 代码中,只要存在变量的条件测试,都是一个用例。比如 x = my_function; puts x if x 其中 my_function 返回字符串或 false。搞定了。 - user229044
2
减少falsey值的数量肯定很方便。看看PHP的混乱情况。数值越少,布尔规则就越清晰、易于理解和记忆。 - deceze
显示剩余6条评论
3个回答

11

我认为我找到了答案。可能是出于理论上的原因和效率考虑。在单个类的不同实例之间绘制线条在理论上比在类之间绘制线条更加复杂,并且需要更多计算。如果“”是假值,那么Ruby内部每次在条件中出现字符串时都必须检查字符串的长度。相反,如果可以仅通过类来判断真假性,这恰好是情况,那么它将更加高效。也许这也是为什么falsetrue没有被归为单个类Boolean而分别属于独立的类的原因。

另一个可能性是只有一个falsenil实例,因此在Ruby内部处理这一点只需要检查指针/对象ID,而字符串是可变的,并且需要更复杂的空值检查。


5
减少被视为"falsey"的事物的数量是一件好事。这简化了语言,简化了布尔规则,使它们更易于记忆和应用,从而减少了错误。 只需看看PHP的混乱情况:false00.0'0'''nullarray()都是"falsey",这让很多人每天都感到惊讶。 如果要测试空字符串,请测试空字符串。您应该知道您的变量包含的是字符串还是布尔值,并能够相应地进行测试。

你说“越少越好”的观点很有道理,但听起来还是有些不够充分。你能详细说明一下在PHP中这个观点为什么会让人感到惊讶吗? - sawa
3
特别是字符串'0',它非常引起争议。它不是一个空字符串,但被认为是false。这似乎相当武断。那么为什么不是字符串'false'(即字符串"false")呢?因为它是一个非空字符串。因此,规则是非空字符串除了字符串'0'外都为false。对于新手来说,这比falsenil等于false更难解释和理解。在PHP中,您必须真正地考虑像此函数可能会返回一个空数组,我真的希望它意味着false吗?或者此处输入可能是“0”,应该是false吗? - deceze
1
但这里的重点不在于“'false'”或“'0'”。而是关于“”(空字符串)。 - sawa
2
也许是这样,但是我的观点是“越少越好”。Ruby将false值的最小可能集合划分得非常接近。它只是尽可能地遵循“少即是多”的哲学。 ""没有被包括在内。问Matz原因,其他人都无法告诉你。 - deceze

2
我认为Ruby的设计初衷是简单易懂,较少的假值能够使程序更加易于推理:“只有两个对象具有布尔值false,它们分别是false对象本身和nil对象。” 这种权衡的结果是你可能需要更多地编写`.blank?`。另一方面,有多少字段的最小长度为1?不多。如果您无论如何都要检查`.size > 1`,那么“空字符串为真”就没有用处。 每种语言都选择其“范式”。例如,在SQL中,布尔运算实际上有3个值(true、false、null)。在Perl和C中,0是false。甚至在某些语言中,字符串“false”也是false。

1
你的回答有点太抽象了。如果越少越好,那么为什么不只有一个假元素,而是两个?为什么两个可以,而三个不行? - sawa

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,