4

我在一个范围内调用了以下语句triples = "AAA".."ZZZ"

  1. triples.include? "ABC" # => true: slow in ruby 1.9 and fast in ruby 1.8

    我理解为什么输出是true,但不明白为什么它在 ruby​​ 1.8 中很快而在 ruby​​ 1.9 中很慢。

  2. triples.include? "ABCD" # => false: ruby 1.9 and true: ruby 1.8

    我不明白为什么两个版本的输出不同。

  3. triples.cover? "ABCD" # => true and fast in ruby 1.9

    与第二个语句相同的问题。

为什么cover?include?语句在 ruby​​ 1.9 中不同?

4

2 回答 2

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"实际上并未包含在 range("AAA".."ZZZ")中,但已被它覆盖。

于 2013-11-04T06:56:56.353 回答
1

在 Ruby 1.9 或更高版本中,对于非数字范围,include?仅当参数是范围的成员时才返回 true。

我想为数字范围添加它,include?仍然与cover?

r = 1..10
r.include?(5) # => true
r.include?(5.5) # => true

范围#包括?

true如果obj是范围的元素,则返回,false否则。如果beginend是数字,则根据值的大小进行比较。

于 2013-11-04T07:10:06.647 回答