2013-07-18 69 views
9

我最近发现可以检测一个类/模块是否包含另一个类/模块。例如ArrayEnumerable所以你可以做Foo <Ruby in Ruby

Array < Enumerable # true 

String但是是不可枚举

String < Enumerable #nil 

究竟发生在这里?这个语法在ruby中如何工作?

回答

8

这里是如何得到祖先链的一类:

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

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

如果一个类的祖先链否则为false另一个类的“左”的<方法返回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 
4

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

返回true如果模块是传递的参数的子类:

String的和Array类从类ClassModuledefines<所述类方法继承继承。如果两者之间没有关系,则返回nil。

的语法:

Array < Enumerable 
String < Enumerable 

可以被看作是:

Array.< Enumerable 
String.< Enumerable 
+1

的['<=>'实例方法] (''Class'](http://www.rubydoc.info/stdlib/core/Class)的(http://www.rubydoc.info/stdlib/core/Module#%3C%3D%3E-instance_method)是这里无关紧要。 ['<实例方法](http://www.rubydoc.info/stdlib/core/Module#%3C-instance_method)有自己的定义,不依赖于'<=>',正如您通过单击“查看源文件“。 –

+0

@ RoryO'Kane,谢谢。编辑。 – Shoe

3

如果两个模块出现在一个祖先链,则普通<=>适用相对于它们的位置在该链。如果不是,则返回nil