无法访问OpenStruct实例的`id`字段

时间:2011-02-06 05:37:17

标签: ruby

我在Ruby中有一些代码,如下所示: Ruby版本:1.8.7

hash = OpenStruct.new(:id=>123, :name=>'wenbo')
puts "#{hash.id} -- #{hash.name}"

D:/workspace/wmch/rubytest/lib/variable.rb:17: warning: Object#id will be deprecated; use Object#object_id
27556896 -- wenbo

有人可以帮助我获取123的id字段值吗?

2 个答案:

答案 0 :(得分:4)

使用这一简单的代码行<{3}}可以回答这个问题

OpenStruct.__send__(:define_method, :id) { @table[:id] }

现在你可以在OpenStruct上设置:id而不是让它忽略你并调用:object_id并带有警告

答案 1 :(得分:2)

看起来像1.8.7下的OpenStruct的bug /限制,其中没有BlankSlate对象,由使用method_missing来确定它是否是特殊属性的实现引起。

这是一个类似于OpenStruct的自定义类,可以满足1.8.7的要求;随意扩展它,使它更丰富。

class MemoStruct
  def initialize( h=nil )
    h.each{ |k,v| add_field(k,v) } if h
  end
  def add_field( name, value=nil )
    inst = :"@#{name}"
    (class << self; self; end).class_eval do
      define_method(name){ instance_variable_get inst }
      define_method("#{name}="){ |v| instance_variable_set inst,v }
    end
    instance_variable_set(inst,value)
  end
  def []=( name, value )
    add_field(name,value)
  end
end

hash = MemoStruct.new :id=>123, :name=>"Jim"
p hash.id
#=> 123

hash["new_field"] = "stuff"
p hash.new_field
#=> stuff