在toro2k的 comments 后修复了Edit.

从源代码12中可以看出,Range#include?Range#cover?似乎有所不同,它们的效率也不同.

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

看看源代码,Range#include?似乎比Range#cover?更复杂.为什么Range#include?不能只是Range#cover?的别名?它们的区别是什么?

推荐答案

这两种方法旨在有目的地做两件稍有不同的事情.在内部,它们的实现方式也非常不同.你可以看看documentation的来源,发现.include?.cover?做得更多

.cover?方法与Comparable模块相关,判断一个项目是否适合排序列表中的端点.即使项目不在Range所暗示的集合中,它也将返回true.

.include?方法与Enumerable模块相关,并判断项目是否实际在Range所暗示的完整集合中.数字有一些细微之处——整数范围包括所有隐含的Float个值(我不知道为什么).

这些例子可能会有所帮助:

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

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

('yellaa'..'yellzz').include?('yellow')
 => true

此外,如果你try

('aaaaaa'..'zzzzzz').include?('yellow')

你应该注意到,这比

('aaaaaa'..'zzzzzz').cover?('yellow')

Ruby相关问答推荐

定义Struct时如何指定成员的类型?

设计登录根路由rails 3

Python 正则表达式是否等同于 Ruby 的原子分组?

Ruby 符号到类

如何增加 ruby​​ 应用程序的堆栈大小.递归应用程序获取:堆栈级别太深(SystemStackError)

如何在 Sinatra 中解析 JSON 请求正文一次并将其公开给所有路由?

如何在没有 Web 服务器的情况下从命令行执行 ruby​​ 模板文件 (ERB)?

如何判断 Ruby 数组是否包含多个值之一?

Ruby:如何判断字符是大写还是小写

在单个 node 上使用 XPath 返回所有 node 中的元素

判断 Ruby HTTP 响应是否成功

RSpec:每次指定对具有不同参数的方法的多次调用

如何使用密码保护我的 /sidekiq 路由(即需要对 Sidekiq::Web 工具进行身份验证)?

错误数量的参数(1 代表 0)在 Ruby 中是什么意思?

如何在 Ruby 中重命名文件?

Ruby Style:如何判断嵌套的哈希元素是否存在

将哈希传递给函数 ( *args ) 及其含义

在 Ruby 中解析制表符分隔文件的最佳方法是什么?

如何删除已安装的 ri 和 rdoc?

如何在 Ruby 循环的第一次迭代中采取不同的行动?