J'ai rencontré des conversions de la matrice de formulaire (valeur), la chaîne (valeur) et l'entier (valeur) à l'occasion. Il me semble que ce ne sont que du sucre syntaxique pour un appel à la valeur correspondante.Oa_a, la valeur.to_s ou la valeur.Tourent les méthodes.
Donc, je me demande: p>
pourrait-il être utilisé dans la coercition de type générique? C'est-à-dire que puis-je faire quelque chose dans le sens de p>
[Integer, String, Array].each {|klass| klass.do_generic_coercion(foo) }
4 Réponses :
bonne question! Voyons si nous pouvons le comprendre.
Ross-Harveys-MacBook-Pro:puppet_sd ross$ irb irb(main):001:0> class X; X; end.new.to_a (irb):1: warning: default `to_a' will be obsolete
+1 Merci d'avoir montré comment vous l'avez trouvé. Cela sera très utile dans les projets futurs!
Votre réponse est proche, mais je trouve que cela est incorrect (.to_a n'est pas obsolète!) Et incomplet. Vérifiez ma réponse ci-dessous.
Ah, désolé, je ne me suis pas réalisé que vous parliez de l'objet par défaut # à_a, qui est à juste titre allé dans 1.9. Votre réponse est donc proche (R) et toujours incomplète ;-) Array (X) appellera TO_ARY si l'on est défini. Je pense que la notion de conversion implicite (to_ary) et de conversion explicite (TO_A) est à la fois subtile et importante.
WOW - Quelle réponse terriblement informative. Merci beaucoup! (Marc-André a également répondu à la troisième partie, c'est pourquoi j'ai "accepté" le sien; les deux ensemble font une lecture très intéressante et instructive.) Merci encore.
Ils sont définis dans le module de noyau Ruby, comme:
Array(1..5) # => [1, 2, 3, 4, 5]
C'est une question bonne et difficile. Réponse aux trois parties.
première partie forte> p> Pour trouver la définition, il est important de réaliser que le nom de la méthode est "Array", etc., qui Peut être assez contre-intuitif, car les méthodes sont généralement minuscules ... p> Cela vous indique que celles-ci sont définies dans le noyau et donc disponibles partout sans nécessiter de préfixe explicite. P > La plupart des autres méthodes de conversion agissent de la même manière, mais Il existe un autre moyen important de convertir des objets en 1.9 (et à venir 1.8.8): Espérons que les réponses aux deux premières parties vous donnent votre réponse finale. .. p> Vous pouvez utiliser: p> ou p> tableau () code>, string () code>, ... sont des méthodes de conversion. Appelant obj.to_a code> retournera un tableau, mais augmentera un nométhoderror code> si obj ne répond pas répond_to? : to_a code>. Donc, le cas typique lorsque vous préférez utiliser tableau () code>, string () code>, au lieu de to_a code> ou to_s code > Est-ce que vous n'êtes pas positif, un objet répond à une méthode de conversion donnée. P> string (obj) code> retournera nil code> si obj pas < code> répondre_to? : to_s code>. String (Obj) vérifiera également que le résultat de TO_S est en réalité une chaîne; Cela devrait être, mais peut-être qu'un programmeur trop créatif a décidé de renvoyer quelque chose d'autre? p> Array (OBJ) code> est différent. Il retournera [obj] code> si obj ne pas répond_to? : to_a code>. Il appellera effectivement to_ary code> (qui est l'opération de conversion implicite, tandis que to_a code> est explicite). P> array.ecteur_convert (obj) code>. Ce retour nil code> si l'OBJ n'est pas répond_to? : to_ary code>. Il n'appellera pas le to_a code>. Bien qu'ils soient plus longs à taper, vous préférez les utiliser lors de l'écriture de code très général pouvant accepter différents types d'objets et que vous souhaitez éviter de convertir un hachage en une matrice par erreur, par exemple (puisque hachage code> a un to_a code> méthode mais pas to_ary code>). Lorsque votre méthode nécessite un objet de type tableau et que vous êtes prêt à faire une conversion explicite, alors obj.to_a code> est bien. L'utilisation typique de (obj) code> serait dans une méthode qui accepte un seul obj code> pour agir ou une liste d'objets (bien que cela soit généralement écrit comme < Code> [* obj] code>). p>
Merci d'avoir répondu. Entre la réponse de cette et DigitalRoss, j'ai appris ce dont j'avais besoin et bien plus encore.
De ce que je comprends, la version simple est comme ceci: p>
objet.to_a code> essaie de convertir "objet" à un tableau à l'aide d'une fonction de membre de classe. LI>
-
array (objet) code> essaie de créer un nouveau tableau à l'aide d'un "objet". Li>
ul>
Je peux ré-définir ce que .to_a code> signifie pour une classe donnée (ce n'est qu'un autre membre après tout). Le tableau (...) code> est défini dans le noyau afin qu'il se comporte de même pour n'importe quelle classe. J'utilise généralement des conversions de type du style tableau (...) code> lorsque je ne sais pas à l'avance sur quel type d'objet sera transmis. Il est préférable de manipuler des cas où un objet ne le fait pas Savoir se convertir en une matrice ou ne peut pas être converti en une matrice. Si l'objet à convertir est le résultat d'une expression longue ou complexe, à l'aide du style (...) code> est souvent plus clair. Je sauvegarde le formulaire .to_a code> pour les instances lorsque je connais la classe de l'objet et exactement à quoi s'attendre à partir de la sortie de .to_a code> (surtout des cas lorsque j'ai écrit ou modifié le .to_a code> fonction de membre moi-même). P>
Je ne fais pas beaucoup de rubis, mais je soupçonne que c'est la syntaxe de casting.
Il n'y a pas de "casting" de rubis. En fait, tout idée i> de casting n'a de sens que dans une langue faiblement dactylographiée comme c, mais le rubis est fortement typé. Ce ne sont que des méthodes telles que toute autre méthode.