加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ruby – 范围和它涵盖的神秘范围

发布时间:2020-12-17 02:32:46 所属栏目:百科 来源:网络整理
导读:我想了解range.cover怎么样?工作和以下似乎令人困惑 – (“as”……“at”).封面?(“屁股”)#true和(“as”……“at”).封面?(“吃”)#false 这个孤立的例子并不会让人感到困惑,因为它似乎被评估为字典样式,其中ass之前是ate. (“1”..“z”).cover?(“
我想了解range.cover怎么样?工作和以下似乎令人困惑 –

>(“as”……“at”).封面?(“屁股”)#true和(“as”……“at”).封面?(“吃”)#false

这个孤立的例子并不会让人感到困惑,因为它似乎被评估为字典样式,其中ass之前是ate.
>(“1”..“z”).cover?(“:”)#true

这个事实似乎是基于ASCII值而不是字典样式,因为在字典中我希望所有特殊字符都在数字之前,并且混乱从这里开始.如果我认为是真的那么如何覆盖?决定使用哪种比较方法,即使用ASCII值或基于字典的方法.
>范围如何与数组一起工作.例如 –

([1] .. [10]).封面?([9,11,335])#true

这个例子我预计是假的.但是从表面看来,在处理数组时,边界值以及cover?的参数都会转换为字符串,简单的字典样式比较会产生真值.这是正确的解释吗?
> Range能够处理什么样的物体?我知道它可以采用数字(除了复杂的数字),处理字符串,能够神秘地使用数组,而布尔值,零值和哈希值等导致它引发ArgumentError:范围的错误值

解决方法

为什么([1] .. [10]).cover?([9,335])返回true

设take a look at the source.在Ruby 1.9.3中,我们可以看到以下定义.

static VALUE
range_cover(VALUE range,VALUE val)
{
  VALUE beg,end;

  beg = RANGE_BEG(range);
  end = RANGE_END(range);
  if (r_le(beg,val)) {
    if (EXCL(range)) {
      if (r_lt(val,end))
        return Qtrue;
    }
    else {
      if (r_le(val,end))
        return Qtrue;
    }
  }
  return Qfalse;
}

如果范围的开头不小于或等于给定值覆盖?返回false.这里小于或等于根据r_lt函数确定,其使用< =>.操作符进行比较.让我们看看它在数组的情况下是如何表现的

[1] <=> [9,335] # => -1

显然[1]确实比[9,335]更小.结果我们进入了第一个if的主体.在内部,我们检查范围是否排除其结束并进行第二次比较,再次使用< =>操作符.

[10] <=> [9,335] # => 1

因此[10]大于[9,335].该方法返回true.

为什么会看到ArgumentError:范围的错误值

引发此错误的函数是range_failed.只有当range_check返回nil时才会调用它.它什么时候发生?当范围的开始和结束是无法比较的时(是的,再次根据我们亲爱的朋友,< =>运算符).

true <=> false # => nil

真假是无法比拟的.无法创建范围并引发ArgumentError.

在结束语中,Range.cover?依赖于< =>事实上是一种预期的和记录在案的行为.见RubySpec的specification of cover?.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读