ruby - 在保持检查输出的同时覆盖 to_s

标签 ruby oop overriding

当我使用 puts 时,我重写了 to_s 方法以获得漂亮的输出,但同时我似乎失去了检查对象的能力。有没有办法在覆盖 to_s 的同时获得 inspect 的正常输出?

class Person
  attr_accessor :first, :last, :birthdate
  def initialize(first=nil, last=nil, birthdate=nil)
    @first, @last, @birthdate = first, last, birthdate
  end
  def age
    if birthdate
      Time.now.year-birthdate
    else
      0
    end
  end
  def to_s
    "#{@first} #{@last} (#{age})"
  end
end

me = Person.new("Peter", "Marien", 1962)
p me  >>Peter Marien (50)
p me.inspect  >>"Peter Marien (50)"

#Need #<Person:0x1ec2550 @first="Peter", @last="Marien", @birthdate=1962>

最佳答案

Ruby 文档 clearly states ,默认情况下 inspect 使用 to_s 作为其输出。

如果您不需要对象的地址,您可以提供自己的检查,以获得几乎相同的行为:

class Person
  def inspect
    vars = self.instance_variables.
      map{|v| "#{v}=#{instance_variable_get(v).inspect}"}.join(", ")
    "<#{self.class}: #{vars}>"
  end
end

但是您也可以安装一个名为 awesome_print 的 gem,它将提供非常好的输出。 首先在控制台中:

$ gem install awesome_print

然后在 irb 或你的脚本中:

require 'awesome_print'
ap Person.new("John")

还有一个内置的pp 库,其用途相似。它仍然无法避免(至少在 Ruby 1.9.2-p290 中)重写 to_s

pp 的简单示例:

require 'pp'
pp Person.new("John")

关于ruby - 在保持检查输出的同时覆盖 to_s,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9524698/

相关文章:

ruby-on-rails - Rails 中的 Gmail 推送通知

c++ - 如何优化/重构这样的代码?

c# - C#创建派生类时,是否可以用n参数函数覆盖0参数虚函数?

css - 覆盖 :hover text-decoration in a different class

ruby - ruby 中的类/静态方法有什么用?

ruby - 看到 Ruby 的内幕了吗?

ruby-on-rails - rails 。如何存储一天中的时间(用于日程安排)?

c++ - 如何使用父类的同名成员函数(通过 this->)?

java - 附加非空字符串的优雅方式

java - 为什么我不能覆盖 onConfigurationChanged(Configuration)?