我一直在尝试并发现我喜欢重新定义Object的to_s
方法。
这是一个坏主意还是好的做法?
答案 0 :(得分:60)
不,你可以随意覆盖to_s
- 没有不良副作用。只要您的新to_s
比内置信息更丰富(不是那里的高标准),您就可以了。
它们有助于让您的测试失败更好地阅读 - 有时候会更多 - 这从来都不是坏事。去吧!
答案 1 :(得分:10)
我在Rails项目中一直覆盖to_s
:
def to_s first_name + " " + last_name end
这样可以更容易地在视图中显示对象:
<%= @person %>
答案 2 :(得分:7)
这样做可能很棘手,因为有时,inspect
方法只调用to_s
,如果更改,则可能无法调试。如果您认为当您需要通过依赖to_s
的方法(例如inspect
)查看结果时,更改p
可能会让您感到困惑,那么您可能需要重新定义inspect
那个班同时。只要你确定你在做什么,你可能想要这样做。
答案 3 :(得分:1)
本身并不“坏”,但它也不是“好”。这实际上取决于具体情况。
如果你这样做是为了一次性(例如在你的rails应用程序的/lib/
文件夹中,对于一个特定的应用程序)它可能没问题(确保给文件一个描述性的名称,例如object_to_s_patch.rb
或类似的,并且所有补丁都在同一个地方)
另一方面,如果你正在做一个宝石或一个lib,我不会覆盖它。相反,我会添加另一种方法 - Object.to_special_s
或其他方法。但是如果可能的话,我也会尝试不触摸对象 - 如果你可以使用YourModule::to_s(object)
,那可能会更好。
这背后的原因是其他人可能正在使用Object.to_s
来处理其他内容,可能在其他库中。 Monkeypatching它会与其他libs产生冲突。
做一个我能想到的gem的唯一例外是当该库的主要点(或其中一个要点)实际上覆盖了该方法时;换句话说,你实际上是在创建一个覆盖Object.to_s
的lib,而不是其他的。我对该案件的文件发出了一些重要警告。这样人们使用它就不会感到惊讶。