Ruby 字符串 Range 中 <=> 比较操作符的疑惑

匿名 · 2012年12月05日 · 最后由 luikore 回复于 2012年12月05日 · 2485 次阅读

疑惑的代码:

tripless = "AAA".."ZZZ" tripless.include? “ABCD” // true in 1.8, false in 1.9 tripless.cover? "ABCD" // ture and fast in 1.9

补充说明:书上介绍 cover? 总是使用连续的成员关系测试,而 include? 和 member 会根据 Range 类型选择使用连续还是离散的成员关系测试。另外,在 Range 里面使用连续的成员关系测试,通过实现 <=> 操作符。

为什么 ABCD 用连续的成员关系测试,"ABCD" 会是“AAA” ... “ZZZ”范围中的端点。比较操作符在对字符串进行 <=> 操作,是什么样的方式呢?使用字节码点数值还是什么呢?

include? 是通过循环遍历元素实现的 cover? 是用比较上下限的方式实现的 1.8 中 include? 应该就和 1.9 的 cover? 一样

字符串比较是字典序,例如 "apple" 就是在 "a" 在 "b" 之间

需要 登录 后方可回复, 如果你还没有账号请 注册新账号