由“香蕉”引出的字符串匹配算法的问题

743 查看

这周的早些时候我注意到String slices in Rust上的一些方法在文档里没有例子,所以我想试着写一些。第一个我打算为之写一个例子的方法是contains,contians可以测试一个字符串是否是另一个的子字符串。思索了一下我决定写一个像这样的例子:

由于我从没有用过这个方法,我想确认这个方法是按照我预想的方式运行,所以我在http://play.rust-lang.org上试运行这个例子。

返回的结果是false。

在复核这个文档并尝试了其他例子(都运行正常)以后,我怀疑play.rust-lang.org的这个方法有一些奇怪的问题。我决定要在本地测试一下这个方法。结果一模一样。我下载了最新的Rust nightly并再次运行这个例子。Rust再一次通知我”bananas”不包含”nana”。

我决定用”bananas”的每一个子字符串去检验contains,以证明事实上不是我在现实生活中突然忘了字母是如何工作的:

运行的结果是:

“nana”是唯一”bananas”调用contains方法返回值为false的子字符串。

我感到高兴起来,我发现了Rust字符串匹配的实现的bug。因为我那时在Hacker School,我也没有比花费一整天去捕获那些预发行的编程语言的标准库的隐藏的bug更好的事了。于是我决定修正这个bug。

这个独特的问题是由两个独立的bugs导致的结果。包含第一个bug的代码