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é?
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é?
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.
verdaderamente ... respuesta fantástica ... bien hecho. – RubyDubee
Es una abstracción con goteras. http://www.joelonsoftware.com/articles/LeakyAbstractions.html – Levi
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. –