Рассмотрим крошечный класс Ruby, подобный этому:
class C
def to_str
raise
end
end
Распространено и / или допустимо ли разрешать to_str
вызывать исключения или существуют существующие библиотеки или идиомы, которые нарушают работу объектов этого класса C
?
Немного предыстории: наше программное обеспечение предоставляет несколько модулей Ruby (реализовано на C). Некоторые из классов, которые мы предоставляем, на самом деле являются строками, поэтому они обеспечивают реализацию to_str
. К сожалению, код, который определяет этот метод to_str
, вызывает ошибки в других (не связанных) компонентах нашего программного обеспечения. Один из обходных путей, который мы рассматриваем, заключается в том, чтобы всегда определять to_str
во всех предоставляемых нами классах, но затем вызывать исключение во время выполнения, если данный тип на самом деле не является строкой. Лично я считаю, что это плохая идея (например, мы никогда не сможем ее вернуть, не нарушив обратную совместимость), но некоторые коллеги не согласны. Поэтому я пытаюсь собрать аргументы в поддержку моей позиции.
Изучив исходный код Ruby C, выяснилось, что есть несколько мест, в которых Ruby ведет себя по-разному в зависимости от того, определяет ли класс метод to_str
- само существование метода заставляет Ruby считать его строка». Может быть, этот стиль проверки того, поддерживается ли to_str
, является распространенным, и есть популярные библиотеки Ruby, которые используют его, а затем утверждают, что фактический вызов to_str
не вызовет исключения?