`Range #include?`和`Range#cover?`之间有什么区别?

saw*_*awa 36 ruby range

编辑修复了toro2k的评论.

Range#include?并且Range#cover?似乎在源代码看作是不同的1,2,和它们在不同的效率.

t = Time.now
500000.times do
    ("a".."z").include?("g")
end
puts Time.now - t    # => 0.504382493

t = Time.now
500000.times do
    ("a".."z").cover?("g")
end
puts Time.now - t    # => 0.454867868
Run Code Online (Sandbox Code Playgroud)

看源代码,Range#include?似乎比复杂Range#cover?.为什么不能Range#include?简单地说别名是Range#cover?什么?

Nei*_*ter 52

这两种方法的目的是为了做两件稍微不同的事情.在内部,它们的实现也非常不同.您可以查看文档中的源代码,看看它.include?做得多多少.cover?

.cover?方法与Comparable模块有关,并检查项目是否适合排序列表中的端点.即使项目不在隐含的集合中,它也会返回true Range.

.include?方法与Enumerable模块有关,并检查项目是否实际上是由隐含的完整集合Range.数字有一些结果 - 整数范围被计算为包括所有隐含Float值(我不知道为什么).

这些例子可能有所帮助

('a'..'z').cover?('yellow')
# => true

('a'..'z').include?('yellow')
# => false

('yellaa'..'yellzz').include?('yellow')
 => true
Run Code Online (Sandbox Code Playgroud)

另外,如果你试试

('aaaaaa'..'zzzzzz').include?('yellow')
Run Code Online (Sandbox Code Playgroud)

你应该注意到它需要很多时间长于

('aaaaaa'..'zzzzzz').cover?('yellow')
Run Code Online (Sandbox Code Playgroud)

  • 我知道了.所以现在我认为"Range #include"是非常神秘的. (3认同)

Bro*_*tse 9

主要区别在于include检查对象是否是范围元素之一,并且封面返回对象是否在边元素之间.你可以看到:

('a'..'z').include?('cc')     #=> false
('a'..'z').cover?('cc')       #=> true
Run Code Online (Sandbox Code Playgroud)