В Ruby, когда вы вызываете a * b
, вы фактически вызываете метод с именем *
для a
. Попробуйте это, например:
a = 5
=> 5
b = 6
=> 6
a.*(b)
=> 30
c = "hello"
=> "hello"
c.*(a)
=> "hellohellohellohellohello"
Таким образом, <String> * <Fixnum>
работает нормально, потому что метод *
в String
понимает, как обрабатывать целые числа. Он отвечает, объединяя несколько копий себя вместе.
Но когда вы делаете 3 * "repeat"
, он вызывает *
на Fixnum
с аргументом String
. Это не работает, потому что Fixnum
метод *
ожидает увидеть другой числовой тип.