在Ruby中重写to_s方法不好?
我一直在试验,发现我喜欢重新定义Object的to_s
方法。
这是一个坏主意,还是很好的做法?
不,你应该随时重写to_s
– 没有不良的副作用。 只要你的新东西比内置的(不完全是一个高标准)更丰富的信息,你就清楚了。
而且,它们可以帮助您将testing失败读得更好 – 有时甚至是很多 – 这绝不是一件坏事。 去吧!
我一直在我的Rails项目中覆盖to_s
:
def to_s first_name +“”+ last_name 结束
以便在视图中显示对象更容易:
<%= @person%>
这样做可能会很棘手,因为有时候, inspect
方法只是调用to_s
,如果改变了,你可能在debugging时遇到麻烦。 如果你认为当你需要通过依赖inspect
的方法(如p
来查看结果时,改变to_s
可能会使你感到困惑,那么也许你需要同时为这个类重新定义inspect
。 只要你确定你在做什么,你可能想要做。
本身并不“坏”,但也不是“好”。 这真的取决于上下文。
如果你正在做一个单一的地方(例如在你的rails应用程序的/lib/
文件夹中,对于一个特定的应用程序),这可能是好的(确保给这个文件一个描述性的名字,比如object_to_s_patch.rb
或类似的,而且所有的补丁都在同一个地方)
另一方面,如果你正在做一个gem或一个库,我不会覆盖它。 相反,我会添加另一种方法 – Object.to_special_s
什么的。 但是,如果可能的话,我也尽量不要触摸对象 – 如果你可以通过使用YourModule::to_s(object)
来得到,那可能会更好。
这背后的原因是其他人可能使用Object.to_s
作为其他的东西,也许在其他库。 monkeypatching它会产生与其他库的冲突。
我能想到的唯一例外就是当图书馆的要点(或其中一个要点)实际上压倒了方法; 换句话说,你是从字面上做一个重写Object.to_s
,而不是别的。 我会在这个案子的文件上提出一些大的警告。 这样使用它的人不会感到惊讶。