2011-01-18 14 views

Respuesta

6

OpenStruct utiliza una combinación de define_method llamadas dentro de un cheque y unless self.respond_to?(name)method_missing. Esto significa que si el nombre de la propiedad entra en conflicto con el nombre de cualquier método existente en el objeto, entonces encontrará este problema.

tokland's respuesta si es buena, pero otra alternativa es definir el método id, p.

test.instance_eval('undef id') 

También podría incorporar esto en su propia versión personalizada de ejemplo OpenStruct

class OpenStruct2 < OpenStruct 
    undef id 
end 

irb(main):009:0> test2 = OpenStruct2.new({:id => 666}) 
=> #<OpenStruct2 id=666> 
irb(main):010:0> test2.id 
=> 666 
+0

Suena bien, no lo hace depende de cualquier variable de instancia (@table, que puede ser refactorizada). – tokland

1

Esta fue la solución clásica, estaría también contento de escuchar una mejor manera:

>> OpenStruct.send(:define_method, :id) { @table[:id] } 
=> #<Proc:[email protected](irb):1> 
>> OpenStruct.new(:id => 666).id 
=> 666 
0

he cambiado a usar Hashery y la BasicStruct (versión renombrada de OpenObject en última versión, 1.4) como que me permite hacer esto:

x = BasicStruct.new({:id => 666, :sub => BasicStruct.new({:foo => 'bar', :id => 777})}) 
x.id  # => 666 
x.sub.id # => 777 
x.sub.foo # => "bar" 
Cuestiones relacionadas