2010-03-30 9 views
8

Cuando escribo esto:¿Por qué no es `" repeat "* 3` lo mismo que` 3 * "repeat" `en Ruby?

puts 'repeat' * 3 

me sale:

>> repeat repeat repeat 

Pero no funciona si hago esto:

puts 3 * 'repeat' 

¿Por qué?

+3

Es una abstracción con goteras. http://www.joelonsoftware.com/articles/LeakyAbstractions.html – Levi

+5

yo diría que no es una abstracción con goteras, no hay ninguna razón para suponer que * es conmutativo para string y fixnum. –

Respuesta

28

En Ruby, cuando llame al a * b, en realidad está llamando a un método llamado * en a. Prueba de esto, por ejemplo:

a = 5 
=> 5 
b = 6 
=> 6 
a.*(b) 
=> 30 

c = "hello" 
=> "hello" 
c.*(a) 
=> "hellohellohellohellohello" 

Así <String> * <Fixnum> funciona bien, ya que el método * en String entiende cómo manejar números enteros. Responde concatenando una cantidad de copias de sí mismo.

Pero cuando lo hace 3 * "repeat", está invocando * en Fixnum con un argumento String. Eso no funciona, porque el método Fixnum* espera ver otro tipo numérico.

+0

verdaderamente ... respuesta fantástica ... bien hecho. – RubyDubee

Cuestiones relacionadas