重写Ruby中的to_s方法是不是很糟糕?

时间:2011-05-16 08:42:26

标签: ruby

我一直在尝试并发现我喜欢重新定义Object的to_s方法。

这是一个坏主意还是好的做法?

4 个答案:

答案 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,而不是其他的。我对该案件的文件发出了一些重要警告。这样人们使用它就不会感到惊讶。