Foo<红宝石吧

时间:2013-07-18 17:52:40

标签: ruby

我最近发现你可以检测一个类/模块是否包含另一个类/模块。例如,ArrayEnumerable,因此您可以执行

Array < Enumerable # true

String但不是可枚举的

String < Enumerable #nil

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

3 个答案:

答案 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中如何工作?

StringArray类继承自Class类继承自Moduledefines <类方法:

  

如果模块是传递参数的子类,则返回true。如果两者之间没有关系,则返回nil。

语法:

Array < Enumerable
String < Enumerable

可以看作:

Array.< Enumerable
String.< Enumerable

答案 2 :(得分:3)

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