Ecco come ottenere la catena antenato di una classe:
>> Array.ancestors
=> [Array, Enumerable, Object, Kernel, BasicObject]
Il metodo < restituisce vero se una classe è "sinistra" di un'altra classe nella catena degli antenati e false altrimenti:
>> Array < Object
=> true
>> Array < Enumerable
=> true
Il metodo < restituisce false se una classe non è "sinistra" o un'altra classe nella catena di antenati.
>> Enumerable < Array
=> false
>> Array < Array
=> false
Enumerable è un modulo che viene miscelato nella alla classe Array, ma non miscelato alla classe String.
>> Array.ancestors
=> [Array, Enumerable, Object, Kernel, BasicObject]
>> String.ancestors
=> [String, Comparable, Object, Kernel, BasicObject]
Se si include il modello Enumerable nella classe String, restituisce vero pure.
class String
include Enumerable
end
# Enumerable is now included in String
String < Enumerable #true
La sintassi funziona a causa di zucchero sintattico.Tutto è un oggetto in Ruby e zucchero sintattico viene anche utilizzato in operazioni di base come aggiunta:
>> 3 + 4
=> 7
>> 3.+(4)
=> 7
La sintassi esplicita per il metodo < è il seguente:
>> Array.<(Object)
=> true
>> Array.send(:<, Object)
=> true
Il [ '<=>' metodo di istanza] (http://www.rubydoc.info/stdlib/core/Module#%3C%3D%3E-instance_method) di ['Class'] (http://www.rubydoc.info/stdlib/core/Class) è irrilevante qui. Il ['<' instance method] (http://www.rubydoc.info/stdlib/core/Module#%3C-instance_method) ha una sua definizione che non si basa su '<=>', come puoi vedere facendo clic su " Visualizza sorgente "nei documenti. –
@ RoryO'Kane, grazie. Modificato. – Shoe