Je n'ai trouvé aucune description pour les opérateurs >
, ,
> =
, dans la documentation pour
Object
et Class
.String > Object # => false
BasicObject > Object # => true
String > Integer # => nil
4 Réponses :
Comme vous l'avez constaté, ces méthodes ne sont définies ni pour Object
ni pour Class
.
Dans votre exemple, elles sont définies dans Lorsque vous voulez savoir dans quelle classe une méthode est définie, utilisez Module code>, qui est le parent de
Class
. Lisez quelque part ici . P > owner
.String.method(:>).owner # => Module
Lorsque la comparaison au niveau de la classe est effectuée, elle recherche la hiérarchie / la relation.
String> Object
renvoie false car Object
est l'ancêtre de la classe String
.
La même chose sera suivie pour cette hiérarchie Object -> Numeric -> Integer
String> Integer
renvoie nil car les deux classes ne sont pas dans la même hiérarchie / relation.
Le Comparable est utilisé pour comparer.
Au fur et à mesure que les classes l'utilisent ou implémentent la méthode <=>, elles peuvent comparer le récepteur à un autre objet, renvoyant -1, 0 ou +1 selon que le récepteur est inférieur, égal ou supérieur à l'autre objet.
Mais au niveau de la classe, la hiérarchie est prise en considération.
Non ce n'est pas. Class.ancestors # => [Classe, Module, Objet, Kernel, BasicObject]
@sawa pouvez-vous détailler?
Ne voyez-vous pas que la liste d'ascendance n'inclut pas Comparable
?
Les instances d'une classe Comparable
sont totalement ordonnées. Les modules (ou classes) sont partiellement ordonnés.
Donc, vous dites que ce n'est pas comparable, c'est une question de hiérarchie? Est la dernière phrase de ma réponse.
Ce n'est peut-être pas clair au début, mais >
est en fait une méthode, vous pouvez donc essayer d'obtenir plus d'informations à ce sujet avec le méthode
méthode:
String.method(:>) # #<Method: Class(Module)#>>
Ce qui signifie que la méthode est définie dans Module
et est appelé sur un objet Class
.
Consultez la documentation ruby: ruby-doc.org/core /Module.html#method-i-3C-3D-3E
Les docs mentionnent un bon mnémonique: < i> "
classe A implique
A "
Étant donné un récepteur
obj
qui répond à une méthodem
,obj.method (: m) .owner
vous dira où la méthodem
est défini. PourA ,
A.method (: <). Owner # => Module
.