我最近发现你可以检测一个类/模块是否包含另一个类/模块。例如,Array
为Enumerable
,因此您可以执行
Array < Enumerable # true
String
但不是可枚举的
String < Enumerable #nil
这到底发生了什么?这个语法在ruby中如何工作?
答案 0 :(得分:8)
以下是如何获取类的祖先链:
>> Array.ancestors
=> [Array, Enumerable, Object, Kernel, BasicObject]
&lt;如果一个类在祖先链中另一个类的“左”,则返回true,否则返回false:
>> Array < Object
=> true
>> Array < Enumerable
=> true
&lt;如果类不是“左”或祖先链中的另一个类,则返回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
&lt;的显式语法方法如下:
>> Array.<(Object)
=> true
>> Array.send(:<, Object)
=> true
答案 1 :(得分:4)
这到底发生了什么?这个语法在ruby中如何工作?
String
和Array
类继承自Class
类继承自Module
类defines <
类方法:
如果模块是传递参数的子类,则返回true。如果两者之间没有关系,则返回nil。
语法:
Array < Enumerable
String < Enumerable
可以看作:
Array.< Enumerable
String.< Enumerable
答案 2 :(得分:3)
如果两个模块出现在祖先链中,则普通<=>
适用于它们在该链中的位置。如果没有,则返回nil
。