编辑修复了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)
主要区别在于include
检查对象是否是范围元素之一,并且封面返回对象是否在边元素之间.你可以看到:
('a'..'z').include?('cc') #=> false
('a'..'z').cover?('cc') #=> true
Run Code Online (Sandbox Code Playgroud)