Fixnum#+
это просто метод. Упрощенно это работает так:
class Fixnum
def +(other)
if Fixnum === other
# normal operation
else
n1, n2= other.coerce(self)
return n1+n2
end
end
end
coerce
используется для автоматического преобразования числовых типов. Это используется, например, если вы делаете 42 + 3.141
. Строка в ruby не может быть автоматически преобразована в числовые значения. Вы можете улучшить класс String
, чтобы сделать это. Вам просто нужно сделать
class String
def coerce(other)
coerced= case other
when Integer
self.to_i
when
self.to_f
end
return coerced, other
end
end
Теперь вы можете сделать
23 + "42" # => 65
0.859 - "4" # => 3.141
Это не работает наоборот. coerce
только для числовых значений "23" + 42
не будет работать. String#+
не будет использовать принуждение.
Упрощенный +
делается в Fixnum
, а не в Integer
специально. Fixnum
и Bignum
имеют свои отдельные методы, потому что они работают по-разному.