ruby - Foo < Ruby 中的 Bar

标签 ruby

我最近发现您可以检测一个类/模块是否包含另一个类/模块。例如 ArrayEnumerable 所以你可以这样做

Array < Enumerable # true

String 但是不可枚举

String < Enumerable #nil

这里究竟发生了什么?这种语法在 ruby​​ 中如何工作?

最佳答案

以下是获取类的祖先链的方法:

>> Array.ancestors
=> [Array, Enumerable, Object, Kernel, BasicObject]

如果一个类是祖先链中另一个类的“左”,则 < 方法返回 true,否则返回 false:

>> Array < Object
=> true
>> Array < Enumerable
=> true

如果一个类不是“左”类或祖先链中的另一个类,则 < 方法返回 false。

>> Enumerable < Array
=> false
>> Array < Array
=> false

Enumerable 是混入 Array 类的模块,但未混入 String 类。

>> Array.ancestors
=> [Array, Enumerable, Object, Kernel, BasicObject]
>> String.ancestors
=> [String, Comparable, Object, Kernel, BasicObject]

如果将 Enumerable 模型包含到 String 类中,它也会返回 true。

class String
  include Enumerable
end

# Enumerable is now included in String
String < Enumerable #true

语法之所以有效,是因为语法糖。在 Ruby 中一切皆对象,语法糖甚至用于加法等基本操作:

>> 3 + 4
=> 7
>> 3.+(4)
=> 7

< 方法的显式语法如下:

>> Array.<(Object)
=> true
>> Array.send(:<, Object)
=> true

关于ruby - Foo < Ruby 中的 Bar,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17730655/

相关文章:

ruby-on-rails - 使用 Nokogiri 我无法在文档中找到某些节点

ruby - 有没有没有 (*)splat 参数的方法来在 Ruby 中传递多个参数?

ruby - 尝试使用 Ruby super 直接调用方法

ruby-on-rails - Rails 3 和 PDFKit,如何将 HTML 文件转换为横向 PDF?

javascript - Ruby 的 ||=(或等于)在 JavaScript 中?

html - 在 Rails 3 中动态标记 div ids

ruby-on-rails - 从 Rails 中确定 ruby​​ 版本

ruby - 登录 vk.com net::http.post_form

html - 使用 Ruby 中的 Nokogiri 抓取特定标题

ruby-on-rails - rails searchkick 中的多个 where 子句