我最近发现可以检测一个类/模块是否包含另一个类/模块。例如Array
是Enumerable
所以你可以做Foo <Ruby in Ruby
Array < Enumerable # true
String
但是是不可枚举
String < Enumerable #nil
究竟发生在这里?这个语法在ruby中如何工作?
我最近发现可以检测一个类/模块是否包含另一个类/模块。例如Array
是Enumerable
所以你可以做Foo <Ruby in Ruby
Array < Enumerable # true
String
但是是不可枚举
String < Enumerable #nil
究竟发生在这里?这个语法在ruby中如何工作?
这里是如何得到祖先链的一类:
>> 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
究竟发生了什么?这个语法在ruby中如何工作?
返回true如果模块是传递的参数的子类:
String
的和Array
类从类Class
从Module
类defines<
所述类方法继承继承。如果两者之间没有关系,则返回nil。
的语法:
Array < Enumerable
String < Enumerable
可以被看作是:
Array.< Enumerable
String.< Enumerable
如果两个模块出现在一个祖先链,则普通<=>
适用相对于它们的位置在该链。如果不是,则返回nil
。
的['<=>'实例方法] (''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)有自己的定义,不依赖于'<=>',正如您通过单击“查看源文件“。 –
@ RoryO'Kane,谢谢。编辑。 – Shoe