在 Ruby 中,为什么 end_with?("") 对于任何字符串总是返回 true?

rii*_*rii 1 ruby

最近,我在编写一些代码时遇到了 Ruby 语言的一些奇怪问题。true事实证明,如果您检查它是否end_with?为空字符串,则任何字符串都会返回。这是为什么?对我来说,这似乎违反直觉:

"hello".end_with?("")
=> true
Run Code Online (Sandbox Code Playgroud)

返回真。有一个测试用例明确检查该方法end_with?

我认为只""应该end_with? ""。但可能有一些我不知道的事情。我只是好奇为什么这是预期的行为?

Jör*_*tag 5

在数理逻辑中,有一个空洞真理的概念。例如,如果您对空集的所有元素做出普遍量化的陈述,则该陈述被认为是空洞正确的\xc2\xa0\xe2\x80\x93 毕竟,因为集合是空的,你将无法提供一个反例!

\n

如果我说“我所有的孩子都是女孩”,那么这句话是空洞的,因为我没有孩子。为了反驳“我所有的孩子都是女孩”这一说法,你必须证明我的孩子中至少有一个不是女孩 \xe2\x80\xa6 但你无法证明这一点,因为我不有孩子吗?因此,我的说法“我所有的孩子都是女孩”是正确的。

\n

例如,这就是为什么Enumerable#all?总是返回true空的原因Enumerable

\n

虽然你所问的概念并不相同,但其背后也有一个逻辑思想。在形式语言理论中,通常假设每个字符串的开头和结尾以及任意两个相邻符号之间都有空字符串(通常表示为\xce\xb5 )。

\n

Chris 的回答显示了一个示例,其中字符串以空字符串结尾会导致逻辑不一致,您将某些内容附加到字符串的末尾,但该字符串不会以您刚刚附加的内容结尾。

\n