Подтвердить что ты не робот

Является ли переопределение методов to_s в Ruby плохим?

Я экспериментировал и обнаружил, что мне нравится переопределять методы Object to_s.

Это плохая идея или это хорошая практика?

4b9b3361

Ответ 1

Нет, вы можете свободно переопределять to_s - никаких побочных эффектов нет. Пока ваш новый to_s более информативен, чем встроенный (не совсем высокий стандарт там), вы в явном виде.

И они помогают сделать ваши неудачи в тестах лучше читаемыми - иногда много - что никогда не бывает плохо. Пойдите для этого!

Ответ 2

Я переопределяю to_s все время в моем проекте Rails:

   def to_s
     first_name + " " + last_name
   end

чтобы было проще показывать объекты в представлении:

<%= @person %>

Ответ 3

Это может быть сложно сделать, потому что иногда метод inspect просто вызывает to_s, и если это будет изменено, у вас может возникнуть проблема с отладкой. Если вы считаете, что изменение to_s может сбить вас с толку, когда вам нужно увидеть результаты с помощью методов, которые полагаются на inspect, например p, то, возможно, вам нужно переопределить inspect для этого класса в одно и то же время. Если вы уверены, что делаете, вы можете это сделать.

Ответ 4

Это не "плохо" само по себе, но это тоже не "хорошо". Это действительно зависит от контекста.

Если вы делаете это для места с одним выстрелом (например, внутри папки rails app /lib/ для конкретного приложения), это, вероятно, хорошо (обязательно укажите файлу описательное имя, например object_to_s_patch.rb или аналогичные, и что все патчи находятся на одном и том же месте)

Если вы делаете драгоценный камень или lib, с другой стороны, я бы не стал его переопределять. Вместо этого я бы добавил другой метод - Object.to_special_s или что-то еще. Но я также постараюсь не трогать Object, если это возможно. Если вы можете обойтись с помощью YourModule::to_s(object), это было бы, вероятно, даже лучше.

Обоснование этого заключается в том, что другие люди могут использовать Object.to_s для других вещей, возможно, в других библиотеках. Monkeypatching будет производить столкновения с этими другими libs.

Единственное исключение при создании драгоценного камня, о котором я могу думать, - это то, что основная точка (или одна из основных точек) этой библиотеки фактически переопределяет метод; другими словами, вы буквально создаете lib, который переопределяет Object.to_s и немного больше. В этом случае я поставил бы большое предупреждение в документацию. Таким образом, люди, использующие его, не будут удивлены.