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?
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?
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.
vraiment ... réponse fantastique ... bien fait. – RubyDubee
C'est une abstraction qui fuit. http://www.joelonsoftware.com/articles/LeakyAbstractions.html – Levi
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. –