0

我正在尝试实现一个gem,它是其他库的redis 包装器,即将ruby 对象存储在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

结尾

笔记 :

从其他库覆盖有效负载方法不在我的脑海中

现在是否有可能得到我上面的意思

4

1 回答 1

1

看起来您只是想调整什么irb,Rails 控制台和朋友将为您的类的对象显示。如果是这样,他们只需调用inspect

检查→字符串

返回一个字符串,其中包含obj的人类可读表示。默认情况下,显示类名和实例变量列表及其值(通过对每个变量调用检查)。用户定义的类应覆盖此方法以更好地表示obj

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

def inspect
  "#<#{class} name: #{@name.inspect} ...>"
end
于 2013-08-14T17:02:54.797 回答