#to_s
для , представляющего объект как String
. В вашем случае вам нужно преобразовать объект в String
, потому что String#+
имеет дело только с String
s. В Ruby преобразования типов выполняются с помощью трехбуквенной формы методов to_X
, то есть to_int
, to_ary
, to_hash
(кто-то не может сосчитать до трех ...), to_str
и т. Д. .
Итак, вам нужно реализовать to_str
, чтобы заставить это работать.
Однако , вы должны только реализовать to_str
, если ваш объект на самом деле является строкой! Если это что-то еще, вы не должны реализовывать to_str
, и клиенты должны явно представлять это как строку, используя to_s
.
По сути, реализация to_str
в Ruby похожа на наследование от String
в Java: это означает, что A
IS-A String
.
В качестве примера рассмотрим, какие классы в базовой библиотеке Ruby на самом деле реализуют методы преобразования типов:
- единственный класс, который реализует
to_ary
, это сам Array
,
- единственный класс, который реализует
to_hash
, это Hash
сам по себе и
- единственный класс, который реализует
to_str
, это сам String
.
Это должно показать вам, что реализация to_str
является очень серьезным вопросом, который не следует предпринимать легкомысленно.
Единственный метод преобразования, который не имеет только тривиальной реализации без операции, - это to_int
, который также реализуется Float
и Numeric
. И на самом деле, я думаю, что это ошибка, поскольку существует бесконечное число Float
с, которые не Integer
с. И Numeric
является суперклассом из Integer
, так что каждый Numeric
IS-A Integer
еще более странен.