3

鉴于没有显式转换Time就无法比较对象Fixnum

0 <= Time.now # => ArgumentError: comparison of Fixnum with Time failed
Time.now <= 10000000000 # => ArgumentError: comparison of Time with 10000000000 failed

以及文档的内容Range#cover?

cover?(obj)truefalse

true如果在范围的和obj之间,则返回。beginend

这测试begin <= obj <= end什么时候exclude_end?falsebegin <= obj < end什么时候exclude_end?true

我预计:

(0...10000000000).cover?(Time.now) # => false

引发异常而不是默默地返回false。为什么它不引发异常?

可以理解的是,通过显式转换,比较有效:

(0...10000000000).cover?(Time.now.to_i) # => true
4

2 回答 2

2

该文档没有提到实现细节。range_cover是根据r_less(via r_cover_p) 实现的。r_less评论说:

/* compares _a_ and _b_ and returns:
 * < 0: a < b
 * = 0: a = b
 * > 0: a > b or non-comparable
 */

这里是来源r_cover_p

static VALUE
r_cover_p(VALUE range, VALUE beg, VALUE end, VALUE val)
{
  if (r_less(beg, val) <= 0) {
    int excl = EXCL(range);
    if (r_less(val, end) <= -excl)
      return Qtrue;
  }
  return Qfalse;
}

正如我们所看到的,从任一r_less调用返回的正数都将导致Qfalse.

现在,我认为文档没有提及它的原因是为了保持轻松。通常(99.9999% 的案例),你应该比较可比的东西,对吧?而在奇怪的情况下,你仍然没有得到正确的答案(“这个时间不属于这个整数范围”)。

于 2016-02-19T15:16:26.347 回答
0

我很确定这两个.include?和.cover?使用案例质量运算符 ( ===),因此您获得的值与以下内容相同:

p Time.now === 1000 #=> false
于 2016-02-19T14:34:15.310 回答