为什么ruby中给定语句的输出为真?

时间:2013-11-04 06:52:28

标签: ruby output

我在范围triples = "AAA".."ZZZ"上调用了以下语句:

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

    我理解为什么输出是true,但是无法理解为什么它在红宝石1.8中很快而在红宝石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

    与第二个陈述相同的问题。

  4. 为什么{1}}和cover?语句在ruby 1.9中有所不同?

2 个答案:

答案 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
  

Range#include?

     

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