7
votes

Ruby - Méthode de tableau Confusion

Nous pouvons appeler la méthode de la matrice dans le niveau supérieur, comme celui-ci

Kernel.Array(something)


0 commentaires

4 Réponses :


0
votes

Qu'est-ce que vous la confusion est la différence entre les méthodes de classe et d'instance.

méthodes de classe ne sont pas un récepteur explicite, et donc pas auto pour accéder à d'autres champs avec. Ils sont juste ....

En général, les méthodes d'instance sont utilisées pour interroger ou manipuler les attributs d'un objet donné, alors que les méthodes de classe sont « aide » ou méthodes « d'usine » qui fournissent une fonctionnalité associée ou particulièrement utile pour un certain type de classe, mais pas dépendant des cas réels en direct (objets) de cette classe.

Je ne sais pas à propos de Ruby, mais Java a (par exemple) une classe, Math qui ne contient que des méthodes d'instance comme sin () , max ( ) , exp () et ainsi de suite: Il n'y a pas d'objet "Math", ce sont des méthodes seulement que des algorithmes mathématiques incarnent. Pas le meilleur exemple, parce que Ruby ces méthodes sont probablement intégrés dans le droit des classes numériques comme les méthodes d'instance.

Le cas que vous mentionnez est un peu confus parce que array 's () et Kernel ' s array () méthode sont en fait différentes méthodes qui font des choses semblables. Les deux sont des méthodes de classe.

Array () prend une liste d'arguments et de marques et retourne un tableau les contenant.

Kernel.Array () prend un seul argument d'un type « capable matrice », telle qu'une séquence, et prend les valeurs retournées par cet argument et construit un tableau à partir de ceux-ci.


UPDATE

Le downvote était peut-être justifiée; Je présente mes excuses pour avoir pris sur un sujet en dehors de mon domaine d'expertise. Je pense que je vais supprimerons cette réponse bientôt.

@ Chuck: J'espère sincèrement que la documentation officielle de la langue / bibliothèque offrirait quelques indices significatifs quant à la façon dont cela fonctionne. Voilà ce que je consultais pour répondre à cette question.

Le rdoc Kernel.Array () :

arg retour en tant que tableau. Essaie d'abord d'appeler arg.to_ary, puis arg.to_a. Si les deux échouent, crée un ensemble d'éléments contenant arg (à moins arg est nulle).

Array () .

Renvoie un nouveau tableau contenant les objets donnés.

Je ne sais pas vous, mais je pense que si les documents varient beaucoup alors soit ils parlent de méthodes distinctes ou la documentation est une épave de train.

@ Freeknight:

Mais tout en Ruby est un objet de quelque sorte, même les classes et modules. Et Kernel.Array est en fait un appel de méthode sur un objet spécifique -. L'objet du noyau

Oui, sous les couvertures, il est similaire à Java aussi. Mais le Array () ne fait rien avec le noyau, plus que Array () fait quoi que ce soit avec le array objet de classe, donc c'est vraiment seulement une argutie sémantique. Il est une méthode d'instance parce que vous pouvez l'accrocher hors classe IPSocket si vous étiez assez fou, et il fonctionnerait toujours de la même manière.


6 commentaires

Le destinataire des méthodes de classe est la classe singleton qui représente la classe.


En général, la méthode de classe est en effet une sorte d'usine ou "assistant" et c'est particulièrement vrai en Java. Mais tout dans Ruby est un objet d'une sorte, même des classes et des modules. Et Kernel.Array est en fait une méthode appeler sur un objet spécifique - l'objet du noyau.


En d'autres termes, il y a un auto au sein de méthodes de classe. En outre, je ne vois aucune preuve que les deux tableau () S sont des méthodes différentes et ne semble pas être une méthode de classe.


Chuck, tableau est un module_function (comme indiqué dans ma réponse) et est donc une méthode de classe sur le noyau ainsi qu'une méthode d'instance privée sur le noyau. (Pour la preuve, vérifiez la définition de rb_define_global_function en classe.c)


@Martinho, c'est incorrect. Le récepteur d'une méthode de classe est la classe. Cependant, la méthode de classe doit être définie sur le singleton de la classe.


Quelques éclaircissements supplémentaires dans ma réponse. La discussion dans les commentaires est tellement intéressante, il pourrait être dommage de supprimer la réponse; Des suggestions (non obscènes) sur ce que je devrais faire?



-2
votes

Ils sont la même chose:

a = kernel.array ('aa')
=> ["AA"]
A.Class
=> Tableau

A = tableau ('AAA')
=> ["AAA"]
A.Class
=> Array

Peut-être qu'il y a un alias?


0 commentaires

0
votes

noyau de module d'objet de classe, mais le noyau est une instance d'objet. Donc, les méthodes de "module" de noyau - sont-elles des méthodes d'instance.


3 commentaires

Cela ne peut pas être raison car la méthode de la matrice est une méthode d'instance privée et ne serait donc pas accessible directement sur le noyau. Essayez-le sur n'importe quel autre objet => objet.new.array # => Erreur de méthode privée


Oui, vous avez raison - dans l'objet de sa méthode d'instance privée (mais dans le noyau son public). Je ne vois aucune variante à l'exception de la classe << noyau public: TRAY FIND


à votre message "lorsque vous l'invoquez via Kernel.Array (), vous l'appelez comme méthode de classe sur le noyau. Ils sont la même méthode." Dans la matrice de documentation, la matrice est une méthode d'instance publique de noyau et problème est de savoir comment il devient la méthode de classe publique du noyau ...



4
votes

Kernel.Array est ce que l'on appelle une fonction de module. D'autres exemples de fonctions de module incluent math.sin et maths.hypot, etc.

Une fonction de module est une méthode qui est à la fois une méthode de classe sur le module et une méthode d'instance privée. Lorsque vous invoquez le tableau () au niveau supérieur, vous l'appelez comme une méthode d'instance privée de l'objet principal. Lorsque vous l'invoquez via Kernel.Array (), vous l'appelez comme méthode de classe sur le noyau. Ils sont la même méthode.

Pour en savoir plus, lisez sur la méthode Module_function dans RubyDocs: http://www.ruby-doc.org/core/classes/module.html#m001642


3 commentaires

+1 pour ce qui semble être une explication très utile. Pouvez-vous s'il vous plaît aborder / expliquer la différence de documentation mentionnée dans ma réponse?


@Carl, quelle documentation lis-tu? Mais il est vrai que de nombreux documents rubis laissent beaucoup à désirer


<< Un href = "http://ruby-doc.org/core/classes/array.html" rel = "Nofollow NOREFERRER"> ruby-doc.org/core/classes/array.html > et << a href = "http://ruby-doc.org/core/classes/kernel.html" rel = "nOfollow noreferrer"> ruby-doc.org/core/classes/kernel.html >. La bouche de cheval, telle qu'elle était. Je pense que RDOC pourrait utiliser un mécanisme d'automatisation de ces doublons identiques intentionnels.