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