编写一个伟大的,可重用的“to_s”方法,以便更好地进行调试

时间:2013-02-15 11:24:35

标签: ruby object

我想要puts经常调试一些对象。 Objects默认to_s方法对于此目的并不是很好。一般来说,我觉得你想要调查实例(所以最有趣的部分是实例变量)所以我想出了这个:

class DebugObject
    def initialize(args)
      raise ArgumentError unless args.is_a? Hash
      args.each { |k,v| instance_variable_set "@#{k}".to_sym,v } 
    end

    def to_s
      str = "#{self.class}:\n"
      instance_variables.each do |var|
        str += " %s: %s" % [var, instance_variable_get(var)]
      end
      str
    end
end

class User < DebugObject
  attrs = [:email, :password, :first_name, :last_name, :street, :postal_code, :city]
  attrs.each { |attr| attr_accessor attr }
end

class CreditCard < DebugObject
  attrs = [:holder, :number, :cardinalidity, :cvc, :error_code, :error_message]
  attrs.each { |attr| attr_accessor attr }
end

与puts一起使用时给我:

User:
 @first_name: Peter @last_name: Parker @street: Street number @postal_code: 9020
 @city: New york @email: peter@parker.com

CreditCard:
  @holder: Martin @number: 00000 @cardinalidity: 09/10 @cvc: 123
  @error_code: 00 @error_message: No eroro :)

我想知道你是否有任何提示和技巧来编写一个在调试时有用的优秀,可重复使用的to_s方法?

1 个答案:

答案 0 :(得分:4)

我建议您使用p代替puts进行打印。 p在对象上打印.inspect的结果,打印出实例变量及其值,其中puts打印出.to_s的结果,但不打印实例变量。