Ruby 范围和它所涵盖的奥秘超出了我的范围

Ruby 范围和它所涵盖的奥秘超出了我的范围,ruby,range,Ruby,Range,我试图了解范围.封面?是如何工作的,下面的内容似乎令人困惑- (“as.”at”).cover?(“ass”)#true和(“as.”at”).cover?#false 这个单独的例子并不令人困惑,因为它似乎是一种字典式的计算方式,其中ass在at之前,紧跟ate (“1”。“z”).封面(“:”)#真实 这一事实似乎基于ASCII值,而不是字典样式,因为在字典中,我希望所有特殊字符都位于偶数数字之前,而混淆从这里开始。如果我认为正确,那么如何涵盖?决定采用哪种比较方法,即使用ASCII值或基于

我试图了解
范围.封面?
是如何工作的,下面的内容似乎令人困惑-

  • (“as.”at”).cover?(“ass”)#true
    (“as.”at”).cover?#false

    这个单独的例子并不令人困惑,因为它似乎是一种字典式的计算方式,其中
    ass
    at
    之前,紧跟
    ate

  • (“1”。“z”).封面(“:”)#真实

    这一事实似乎基于ASCII值,而不是字典样式,因为在字典中,我希望所有特殊字符都位于偶数数字之前,而混淆从这里开始。如果我认为正确,那么
    如何涵盖?
    决定采用哪种比较方法,即使用ASCII值或基于词典的方法

  • 范围是如何与数组一起工作的。比如说-

    ([1]…[10])。封面?([9,11335])#真实

    我认为这个例子是错误的。但从表面上看,在处理数组时,边界值以及
    cover?
    的参数都被转换为字符串,一个简单的字典式比较就会得到true。这是正确的解释吗

  • Range
    配备了什么样的物体来处理?我知道它可以接受
    数字
    (复杂的数字除外),处理
    字符串
    ,能够神秘地处理
    数组
    ,而
    布尔值、nil值和hash值以及其他值会导致它产生
    参数错误:范围的值不正确

  • 为什么
    ([1]..[10])包含?([9,11335])
    返回
    true
    我们走吧。在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;
    }
    
    如果范围的起始值不小于或等于给定值
    cover?
    返回
    false
    。此处根据函数确定小于或等于,该函数使用
    运算符进行比较。让我们看看它在数组中的行为

    [1] <=> [9,11,335] # => -1
    
    因此
    [10]
    大于
    [9,11335]
    。该方法返回
    true

    为什么会看到
    ArgumentError:范围的值不正确
    负责引发此错误的函数为。只有当
    range\u check
    返回
    nil
    时,才会调用它。什么时候发生?当范围的开始和结束不可比较时(是的,我们亲爱的朋友,
    操作员)

    true-false#=>nil
    
    true
    false
    是不可压缩的。无法创建范围,并引发
    ArgumentError


    在结束语中,
    Range.cover?
    的依赖实际上是一种预期和记录的行为。请参阅。

    您使用的是哪个版本的Ruby,因为我无法使用Ruby 1.9.2Excellent answer复制您的输出。真是假,零让我生气。每个蠢货都知道真理大于谬误:)
    [10] <=> [9,11,335] # => 1
    
    true <=> false # => nil