在Ruby中,为什么以_结尾?(“”)总是为任何字符串返回true?

brvekthn  于 2023-08-04  发布在  Ruby
关注(0)|答案(2)|浏览(130)

我最近在写代码的时候遇到了一点Ruby语言的奇怪之处。如果你检查end_with?是否是一个空字符串,那么任何字符串都会返回true。为什么会这样?对我来说,这似乎是违反直觉的:

"hello".end_with?("")
=> true

字符串
返回true。在end_with?方法上有一个测试用例显式地检查这一点。
在我看来,只有""应该end_with?""。但可能有些事我不知道。我只是好奇为什么这是预期的行为?

ttcibm8c

ttcibm8c1#

在数理逻辑中,有Vacuous Truth的概念。例如,如果你对一个空集的所有元素做了一个普遍量化的陈述,这个陈述被说成是 vacuously true --毕竟,因为这个集合是空的,你将无法提供一个反例!
如果我说“我所有的孩子都是女孩”,那句话是“空洞的真实”,因为我没有任何孩子。为了反驳我所有的孩子都是女孩的说法,你必须证明我的孩子中至少有一个不是女孩......但你不能证明这一点,因为我没有孩子。因此,我的声明“我的孩子都是女孩”是真的。
这就是为什么,例如,Enumerable#all?总是为空的Enumerable返回true
虽然你问的概念是不一样的,但它背后也有一个逻辑思想。在formal language theory中,通常假设在每个字符串的开头和结尾以及任何两个相邻符号之间都有空字符串(通常表示为 ε)。
Chris' answer显示了一个例子,其中 not 具有以空字符串结尾的字符串会导致逻辑不一致,即您在字符串的结尾追加了一些内容,但字符串并没有以您刚刚追加的内容结束。

46qrfjad

46qrfjad2#

正如在评论中所指出的,如果它不这样工作,下面的就不会工作。foo应该总是返回true,但如果不是所有字符串都以""结尾,则不会返回。

irb(main):001:1* def foo(a, b)
irb(main):002:1*   (a + b).end_with? b
irb(main):003:0> end
=> :foo
irb(main):004:0> foo("hello", "world")
=> true
irb(main):005:0> foo("hello", "")
=> true

字符串
在任何一种实际的程序中,您似乎都不太可能测试字符串是否以""结尾。“

相关问题