如果对象可以在Ruby中打印自己呢?[对象打印]

如果对象可以在Ruby中打印自己呢?[对象打印],ruby,Ruby,我在想,在Ruby对象类中定义print方法不是很酷吗?考虑以下事项: class Object def print puts self.to_s end end 23.times &:print 有这样的东西有什么问题吗?这似乎是一个很好的功能。它看起来也很容易阅读。已经有了定义。另外,在对象类和从其继承的每个类中,已经定义了私有方法 向对象添加方法的主要问题是,它们变得通用,并且可能与其他库或项目中类似命名的方法冲突 Ruby core中已经有多种简单的方法可以输

我在想,在Ruby对象类中定义print方法不是很酷吗?考虑以下事项:

class Object
  def print
    puts self.to_s
  end
end

23.times &:print
有这样的东西有什么问题吗?这似乎是一个很好的功能。它看起来也很容易阅读。

已经有了定义。另外,在对象类和从其继承的每个类中,已经定义了私有方法


向对象添加方法的主要问题是,它们变得通用,并且可能与其他库或项目中类似命名的方法冲突

Ruby core中已经有多种简单的方法可以输出数据或转换为字符串形式,因此,即使在您自己的代码中,在非常有用的方法名称上发生冲突的风险也可能超过更好的语法带来的任何好处

如果您在自己的项目中有一组较小的类,您觉得这是一个有用的特性,那么这是一个理想的mixin用例

定义一个模块:

module CanPrintSelf
  def print
    puts self.to_s
  end
end
并将其包含在您想要具有该功能的任何类中:

class MyClass
  include CanPrintSelf
end

my_object = MyClass.new

my_object.print

因此,如果您喜欢,可以使用此功能,并且不需要修改对象。

此方法已存在于Ruby标准库中。但是,它有一个不同的名称:


如您所见,它不会在对象的字符串表示形式之后写换行符;它不适合对象检查。

当调试或临时插入代码时,p也很好地覆盖了OP的用例,irb默认情况下会这样做。此外{object}将调用object.to_s@NeilSlater我想我应该说清楚:我不是在寻找传递对象并打印结果的方法。我特别为能够将该方法作为过程传递给任何枚举器并快速查看其内部表示而感到兴奋。虽然这可能更为密集,但我觉得它看起来非常可读。@JikkuJose:您可以检查像这样的枚举数p 23.times.to_a-其优点是Ruby内部类型指示器也会出现。这是因为。to_a包含在枚举中,我了解@NeilSlater;但我一直在强调电话发生的方式。与其将对象传递给进行打印的方法,不如打印对象本身。我也觉得代码看起来更可读,就像我建议的那样?@JikkuJose:我真的没有看到任何额外的可读性,而且对我来说似乎非常合适。但如果你想寻求批评,最好还是发到codereview.stackexchange.com——这个问题在某种程度上介于某个网站和那个网站之间。在堆栈溢出问题上,您可能会直接得到这样的问题的答案,而不是批评。我的回答肯定是针对我所看到的问题,我试图避免表达一种风格偏好。谢谢,但是这个定义会取代使用打印方法的对象吗?因为当定义匹配时,方法查找将在较早的级别停止。@JikkuJose:您能重新表述它,或者给出一些代码吗?任何时候都不会更换任何对象,我也不清楚你的意思。对不起,把你弄糊涂了。让我试着用一个例子来解释:假设有一个Printer类具有print方法。我假设您在这种情况下谈论的是冲突,但我相信这不会是一个问题,因为对象在方法查找中非常复杂。如果任何更高的类定义了该方法,则将调用它,并且方法查找将不会到达对象中的monkey patched定义。例如:print in对象的方法定义并没有覆盖Printer类的预期行为。希望我现在明白了?啊,是的,我现在明白了,谢谢。如果您希望对包含打印机对象的枚举器使用语法,则会出现问题-您将调用错误的方法。嗯,是的!明白了,但我还是觉得放上这个对象看起来更好:我想如果它加上一条新线会更好吗?你知道为什么它会避免吗?
23.times &:display

# 012345678910111213141516171819202122