我在范围triples = "AAA".."ZZZ"
上调用了以下语句:
triples.include? "ABC" # => true: slow in ruby 1.9 and fast in ruby 1.8
我理解为什么输出是true
,但是无法理解为什么它在红宝石1.8中很快而在红宝石1.9中很慢。
triples.include? "ABCD" # => false: ruby 1.9 and true: ruby 1.8
我无法理解为什么两个版本的输出都不同。
triples.cover? "ABCD" # => true and fast in ruby 1.9
与第二个陈述相同的问题。
为什么{1}}和cover?
语句在ruby 1.9中有所不同?
答案 0 :(得分:4)
在Ruby> = 1.9中,include?
遍历范围中的每个元素并检查给定元素是否存在。
cover?
只检查元素是否是> =第一个元素范围和< =该范围的最后一个元素。
由于Ruby对字符串进行排序(词法上),
"ABCD" > "AAA"
和"ABCD" < "ZZZ"
。
在Ruby 1.8中,include?
被视为Ruby 1.9的cover?
。
为了回答你为何与众不同的问题,你的例子说明了对两种不同方法的需求。
例如,如果您想检查一个数字是否在数字范围内,(0..1_000_000_000).cover?(1_000_000_001)
比include?
快得多 - 检查两个元素而不是十亿个。
但是,您的示例显示了为什么include?
是必要的:"ABCD"
实际上并未包含在("AAA".."ZZZ")
范围内,但它已被覆盖。
答案 1 :(得分:1)
在Ruby 1.9或更高版本中,对于非数字范围,include?
仅在参数是范围的成员时才返回true。
我想补充一点,对于数字范围,include?
仍然与cover?
相同:
r = 1..10
r.include?(5) # => true
r.include?(5.5) # => true
如果
true
是范围的元素,则返回obj
,否则返回false
。如果begin
和end
是数字,则根据值的大小进行比较。