Ruby 将对象显示为名称-值对而不是实例变量
我正在尝试实现一个gem,它是其他库的redis包装器,即在redis中存储ruby对象 一切都很好,但我想要的是Ruby 将对象显示为名称-值对而不是实例变量,ruby,Ruby,我正在尝试实现一个gem,它是其他库的redis包装器,即在redis中存储ruby对象 一切都很好,但我想要的是 [Class]。所有 它给这样的物体 [#,#] 但我希望它看起来像是活动记录呈现对象的方式 [#,#] 原因是我不想向用户显示@payload实例变量,因为它是由另一个库设置的 所以基本上是这样的 [我的宝石] class Peagon include SomeModule attr_accessor :name,:omg,:handler def initialize(
[Class]。所有
它给这样的物体
[#,#]
但我希望它看起来像是活动记录呈现对象的方式
[#,#]
原因是我不想向用户显示@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 SomeModule
def payload=(object)
@payload ||= object
self.handler = @payload.to_yaml
end
def payload
@payload ||= YAML.load(self.handler)
end
结束
注:
我不想覆盖其他库中的有效负载方法
现在是否有可能得到我上面的意思看起来您只是想调整irb
、Rails控制台和friends将为您的类对象显示的内容。如果是这样,他们只需打电话:
检查→ 字符串
返回包含obj的可读表示形式的字符串。默认情况下,显示类名和实例变量及其值的列表(通过对每个实例变量调用inspect)。用户定义的类应该重写此方法,以便更好地表示obj
因此,您只需提供自己的inspect
实现,例如:
def inspect
"#<#{class} name: #{@name.inspect} ...>"
end
def检查
"#"
结束
Opps我忘了提到我也尝试过这种方法,我给出了这个方法,因为inspect
返回字符串对象,因此无法调用对象/实例方法,但在activerecord中,它给了您类的对象,这样您就可以在任何其他方法上调用对象/实例方法,从而返回类的对象具有所需的行为对不起,我不明白。当我在Rails控制台中说Model
时,我得到的结果是Model(id:integer,…)
,因为这是inspect
为类所说的;如果我说Model.first
,我会得到#
,因为这就是inspect
对实例所说的。所有这些都与获取“具有所需行为的类的对象”无关。Opps:P我现在在想,inspect会返回交叉检查的字符串对象,谢谢