Как избавиться от TypeError - PullRequest
       0

Как избавиться от TypeError

1 голос
/ 02 октября 2010

У меня есть свой класс


class A
  def to_s
    'string'
  end
  def inspect
    'string'
  end
end

и пытается сделать что-то подобное


a = A.new
'somestring' + a

Ошибка "in` + ': невозможно преобразовать A в String (TypeError) "

Есть ли способ это исправить?

P.S. использование 'somestring' + a.to_s не вариант.

Ответ найден. Необходим метод to_str.

1 Ответ

1 голос
/ 02 октября 2010

#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 еще более странен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...