4
votes

Que signifie comparer des classes avec des opérateurs supérieurs à «>» et inférieurs à «<»?

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


3 commentaires

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éthode m , obj.method (: m) .owner vous dira où la méthode m est défini. Pour A , A.method (: <). Owner # => Module .


4 Réponses :


4
votes

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 Module code>, qui est le parent de Class . Lisez quelque part ici . P >

Lorsque vous voulez savoir dans quelle classe une méthode est définie, utilisez owner.

String.method(:>).owner # => Module


0 commentaires

6
votes

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.


0 commentaires

0
votes

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.


5 commentaires

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.



1
votes

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 .


0 commentaires