Ruby Array # setter ikke bruker styres implementering?

stemmer
0

Jeg bruker Ruby 1.8.6 for følgende kode:

# 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

Produksjon:

Using print: one
Using puts: 
1
2
3

ting er en Array og jeg har overstyrt ting #to_s. print ser ut til å bruke min overstyrt gjennomføring mens setter ikke. Hvorfor?

Jeg har fulgt kildekoden til Kernel # setter og Kernel # print (som er C-implementeringer) og se at de er svært forskjellige implementasjoner. Jeg vil vite hva som kan være design-avgjørelsen (om noen) bak dette?

Forresten, hvis jeg lager ting som en forekomst av en annen klasse skrev jeg (eller som en Hash / String / andre-klassene jeg prøvde), både trykte og setter bruke styres gjennomføringen av to_s.

Publisert på 29/12/2009 klokken 22:59
kilden bruker
På andre språk...                            


2 svar

stemmer
2

Fra Ruby Programming Language:
alt-tekst http://ecx.images-amazon.com/images/I/41n-JSlBHkL._SL75_.jpg

Output bekker er innspillings, som strenger og arrayer er, og du kan skrive verdier til dem med <<operatør. putser en av de vanlige trykkemetoder. Den konverterer hver av argumentet til en streng, og skriver hver til strømmen. Hvis strengen ikke allerede avsluttes med en linjeskift karakter, legger det en. Hvis noen av argumentene for setter er en matrise, er matrisen rekursivt utvidet, og hvert element er trykt på en egen linje som om den ble sendt direkte som et argument til setter. Den printfremgangsmåte omdanner argumentet til strenger, og sender den videre til datastrømmen. Hvis den globale feltet separator $, er endret fra standardverdien nil, da denne verdien er utgang mellom hver av argumentene til print. Hvis utgangen posten separator $/er endret fra standardverdien nil, da denne verdien er utgang etter at alle argumenter er skrevet ut.

Som for design beslutninger, som jeg ikke kjenner.

Svarte 29/12/2009 kl. 23:11
kilden bruker

stemmer
3

Oh boy ... Dette har allerede vært tema for et utall av endeløse tråder på ruby-talk mailinglisten, ruby-core mailinglisten og en gazillion av blogger.

Kjernen i det er at putsspesielle tilfeller Arrays. Hvorfor det spesielle tilfeller disse, hvorfor det spesielle tilfeller bare de (i motsetning til, si, alt Enumerableer), hvorfor det spesielle tilfeller de (og ikke si, print), ingen egentlig vet. Det er slik det er.

BTW, siden du nevnte POLS: Ruby samfunnet har alltid gjort det veldig klart at POLS bare gjelder for Matz. Så, er Ruby om ikke overraskende Matz. Hvis du eller meg eller noen andre er overrasket, som ikke teller.

Svarte 30/12/2009 kl. 01:06
kilden bruker

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