2010-03-30 33 views
8

Quand je tape ceci:Pourquoi "répéter" * 3` n'est-il pas identique à "3 *" répéter "` dans Ruby?

puts 'repeat' * 3 

je reçois:

>> repeat repeat repeat 

Mais il ne fonctionne pas si je fais ceci:

puts 3 * 'repeat' 

Pourquoi?

+3

C'est une abstraction qui fuit. http://www.joelonsoftware.com/articles/LeakyAbstractions.html – Levi

+5

Je dirais que ce n'est pas une abstraction qui fuit, il n'y a aucune raison de supposer que * est commutative pour string et fixnum. –

Répondre

28

Dans Ruby, lorsque vous appelez a * b, vous appelez en fait une méthode appelée * sur a. Essayez ceci, par exemple:

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

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

Ainsi <String> * <Fixnum> fonctionne très bien, parce que la méthode * sur String comprend comment gérer des entiers. Il répond en concaténant un certain nombre de copies de lui-même ensemble. Mais quand vous faites 3 * "repeat", il appelle * sur Fixnum avec un argument String. Cela ne fonctionne pas, car la méthode * de Fixnum s'attend à voir un autre type numérique.

+0

vraiment ... réponse fantastique ... bien fait. – RubyDubee