将对象显示为名称值对而不是实例变量

时间:2013-08-14 16:13:40

标签: ruby

我正在尝试为其他库实现一个redis包装器的gem,即将redy对象存储在redis中。

一切运作良好,但我想要的是什么时候

[Class].all  它给出了像这样的对象

[#<Peagon:0x007fba589de3a0 @name="a", @omg=false ,@payload="one",@handler="--- one\n...\n"> ,#<Peagon:0x007fba589de1a0 @name="b", @omg=true,@payload="two",@handler="--- two\n...\n">]

但我希望它看起来像主动记录如何呈现对象

[#<Peagon name: "a",omg: false ,handler: "--- one\n...\n"> ,#<Peagon name="b", omg: true,handler: "--- two\n...\n">]

这样做的原因是我不想向用户显示@payload实例变量,因为这是由其他库设置的东西

所以基本上就像这样 [我的宝石]

class Peagon
 include SomeModule
 attr_accessor :name,:omg,:handler 
 def initialize(options)
   @name = options[:name]
   @omg  = options
   self.payload_object = options[:payload_object]
 end

end 

现在 [其他资料库] 中有module

module SomeModule 
 def payload=(object)
   @payload ||= object
   self.handler = @payload.to_yaml

 end 

 def payload
   @payload ||= YAML.load(self.handler)
 end

结束

注意:

我不介意从其他库中覆盖有效负载方法

现在可以得到我的意思

1 个答案:

答案 0 :(得分:1)

看起来您只想调整irb,Rails控制台和朋友将为您的班级对象显示的内容。如果是这样,他们只需拨打inspect

  

inspect→string

     

返回包含 obj 的人类可读表示形式的字符串。默认情况下,显示类名称以及实例变量及其值的列表(通过在每个变量上调用 inspect )。用户定义的类应该重写此方法,以更好地表示 obj

所以你需要做的就是提供你自己的inspect实现,例如:

def inspect
  "#<#{class} name: #{@name.inspect} ...>"
end