Невозможно получить доступ к полю `id` экземпляра OpenStruct - PullRequest
3 голосов
/ 06 февраля 2011

У меня есть код на 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

Может кто-нибудь помочь мне узнать, как получить значение поля id для 123?

Ответы [ 2 ]

4 голосов
/ 01 марта 2012

Ответ на этот вопрос в этом сообщении в блоге с этой простой строкой кода

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

Теперь вы можете установить: id в OpenStruct и не заставлять его игнорировать вас и вызывать: object_id с предупреждением

2 голосов
/ 06 февраля 2011

Похоже, ошибка / ограничение OpenStruct в 1.8.7, где нет объекта 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...