ruby – 范围和它涵盖的神秘范围
我想了解range.cover怎么样?工作和以下似乎令人困惑 –
>(“as”……“at”).封面?(“屁股”)#true和(“as”……“at”).封面?(“吃”)#false 这个孤立的例子并不会让人感到困惑,因为它似乎被评估为字典样式,其中ass之前是ate. 这个事实似乎是基于ASCII值而不是字典样式,因为在字典中我希望所有特殊字符都在数字之前,并且混乱从这里开始.如果我认为是真的那么如何覆盖?决定使用哪种比较方法,即使用ASCII值或基于字典的方法. ([1] .. [10]).封面?([9,11,335])#true 这个例子我预计是假的.但是从表面看来,在处理数组时,边界值以及cover?的参数都会转换为字符串,简单的字典样式比较会产生真值.这是正确的解释吗? 解决方法
为什么([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.这里小于或等于根据 [1] <=> [9,335] # => -1 显然[1]确实比[9,335]更小.结果我们进入了第一个if的主体.在内部,我们检查范围是否排除其结束并进行第二次比较,再次使用< =>操作符. [10] <=> [9,335] # => 1 因此[10]大于[9,335].该方法返回true. 为什么会看到ArgumentError:范围的错误值 引发此错误的函数是 true <=> false # => nil 真假是无法比拟的.无法创建范围并引发ArgumentError. 在结束语中,Range.cover?依赖于< =>事实上是一种预期的和记录在案的行为.见RubySpec的specification of (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |