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

ruby – 范围和它涵盖的神秘范围,第1张

概述我想了解range.cover怎么样?工作和以下似乎令人困惑 – >(“as”……“at”).封面?(“屁股”)#true和(“as”……“at”).封面?(“吃”)#false 这个孤立的例子并不会让人感到困惑,因为它似乎被评估为字典样式,其中ass之前是ate. >(“1”..“z”).cover?(“:”)#true 这个事实似乎是基于ASCII值而不是字典样式,因为在字典中我希望所有特殊字 我想了解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 VALUErange_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?.

总结

以上是内存溢出为你收集整理的ruby – 范围和它涵盖的神秘范围全部内容,希望文章能够帮你解决ruby – 范围和它涵盖的神秘范围所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/1279513.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-09
下一篇 2022-06-09

发表评论

登录后才能评论

评论列表(0条)

保存