J'utilise Ruby 1.8.6 pour le code suivant:Ruby Array # n'utilise pas l'implémentation surchargée?
# Create an array and override the #to_s on that object
thing = [1,2,3]
def thing.to_s
'one'
end
print "Using print: "
print thing
puts
puts "Using puts: "
puts thing
Sortie:
Using print: one
Using puts:
1
2
3
Alors chose est un Tableau et je l'ai chose substituée #to_s. impression semble utiliser ma mise en œuvre dépassée tandis que met ne fonctionne pas. Pourquoi?
J'ai suivi le code source de Kernel # puts et Kernel # print (qui sont des implémentations C) et je vois qu'il s'agit d'implémentations très différentes. Je veux savoir quelle pourrait être la décision de conception (le cas échéant) derrière cela?
D'ailleurs, si je crée chose comme une instance d'une autre classe que j'ai écrit (ou une table de hachage/cordes/autres classes que j'ai essayé), à la fois l'impression et met utiliser la mise en œuvre surchargée de to_s.
Dans le cas où quelqu'un l'aurait manqué dans l'explication plutôt verbeuse: 'puts' des tableaux de cas spéciaux de sorte que si vous en passez un comme argument, puts fait' arg.each {| i | met i} '. – Chuck
Oui, cela explique cela. Cependant, avec le POLS de Ruby (principe des moindres surprises) à l'esprit, je m'attendais à ce que puts utilise la méthode #to_s que j'ai écrite. Peut-être, il y a un cas pour la méthode puts d'avoir un autre cas particulier. Si l'objet a un usage défini to_s qui autrement passerait par la routine. En même temps je peux voir que les puts ne sont probablement pas trop utilisés dans le code de production (vous feriez mieux d'utiliser les enregistreurs à moins que vous ne vouliez écrire dans des fichiers) donc cette implémentation est correcte. – arnab
@JRL Les images que vous avez mises sont manquantes. – ismail