gpt4 book ai didi

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

转载 作者:数据小太阳 更新时间:2023-10-29 07:57:10 26 4
gpt4 key购买 nike

当我使用 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com