2011-02-06 89 views
3

的`id`領域我有一些代碼在Ruby中象下面這樣: 的Ruby版本:1.8.7無法訪問OpenStruct實例

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字段的值?

+0

即使使用1.9.2下的`ruby -w`,我也沒有得到這個警告;你在運行什麼風味和版本的Ruby? – Phrogz 2011-02-06 05:42:43

+0

@Phrogz 1.8.7,爲該問題添加了版本信息,謝謝您的提醒。 – ywenbo 2011-02-06 05:48:16

回答

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 
4

這個問題的答案在此blog post用這個代碼簡單的線條

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

現在,您可以設置:身份證上的OpenStruct並沒有它不理你,並呼籲:一個警告

OBJECT_ID