Ruby-Array # setzt nicht außer Kraft gesetzt Implementierung mit?

stimmen
0

Ich bin mit Ruby 1.8.6 für den folgenden Code:

# 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

Ausgabe:

Using print: one
Using puts: 
1
2
3

Also , was ist ein Array , und ich habe außer Kraft gesetzt , was #to_s. Druck scheint meine überschriebene Implementierung zu verwenden , während Puts nicht. Warum?

Ich habe den Quellcode der Kernel # Puts und Kernel # print (die C-Implementierungen) gefolgt und sehen, dass sie sehr unterschiedliche Implementierungen. Ich will wissen, was könnte die Design-Entscheidung (falls vorhanden) hinter dem sein?

By the way, wenn ich schaffen , was als eine Instanz einer anderen Klasse schrieb ich (oder als Hash / String / other-Klassen Ich habe versucht), beide Druck und Puts nutzen die überschriebene Implementierung von to_s.

Veröffentlicht am 30/12/2009 um 01:59
quelle vom benutzer
In anderen Sprachen...                            


2 antworten

stimmen
2

Aus der Programmiersprache Ruby:
Alt - Text http://ecx.images-amazon.com/images/I/41n-JSlBHkL._SL75_.jpg

Ausgangsströme sind appendable, wie Strings und Arrays sind, und Sie können mit den Werten ihnen schreiben <<Operator. putsist einer der am häufigsten verwendeten Ausgang Methoden. Er wandelt jedes seiner Argumente in einen String und schreibt jeden in den Stream. Wenn die Zeichenkette nicht bereits mit einem Newline - Zeichen am Ende, fügt es ein. Wenn irgendwelche der Argumente setzt ein Array ist, wird das Array rekursiv erweitert, und jedes Element wird in einer eigenen Zeile gedruckt , als ob es direkt als Argument setzt geben wurden. Das printVerfahren konvertiert ihre Argumente in Zeichenfolgen und gibt sie an den Stream. Wenn der globalen Feldseparator $, wurde von dem Standardwert geändert nil, dann wird dieser Wert wird ausgegeben zwischen jedem des Arguments print. Wenn der Ausgangsdatensatz - Trenn$/wurde von dem Standardwert geändert nil, so ist dieser Wert ausgegeben wird, nachdem alle Argumente gedruckt.

Wie für Design-Entscheidungen, die ich nicht kenne.

Beantwortet am 30/12/2009 um 02:11
quelle vom benutzer

stimmen
3

Oh Mann ... Dies war bereits das Thema einer unzähligen Anzahl von endlosen Fäden auf der Rubin-talk Mailingliste, die Rubin-Core-Mailingliste und eine Unmenge von Blogs.

Der Kern von ihm ist , dass putsSonderfälle Arrays. Warum es Sonderfälle jene, warum es Sonderfälle nur diejenigen (im Gegensatz zu, sagen wir, alle Enumerables), warum es Sonderfälle diejenigen (und nicht etwa print), niemand wirklich kennt. Es ist so , wie es ist.

BTW, da Sie erwähnten den POL: die Ruby - Community hat immer macht es sehr klar , dass der POL nur gilt für matz. So ist Rubin über nicht überraschend matz. Wenn Sie oder ich oder sonst jemand überrascht ist, das zählt nicht.

Beantwortet am 30/12/2009 um 04:06
quelle vom benutzer

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more