2012-05-25 17 views
7

Ho una classe Ruby che include un modulo. Voglio che la classe inclusa si comporti come OpenStruct. Come ottengo ciò senza ereditare esplicitamente da OpenStruct?Posso estendere una classe Ruby per comportarsi come OpenStruct dinamicamente?

class Book 
    include MyModule 
end 

module MyModule 
    def self.included(klass) 
    # Make including class behave like OpenStruct 
    end 
end 

invece di

class Book < OpenStruct 
    include MyModule 
end 
+0

Vuoi utilizzare classe OpenStruct modo o implementare questa funzionalità da soli? – Flexoid

+0

Voglio utilizzare OpenStruct – Sathish

risposta

7

Si potrebbe delegare tutti i metodi la classe non gestisce a un OpenStruct:

require 'ostruct' 

class Test_OS 

    def initialize 
    @source = OpenStruct.new 
    end 

    def method_missing(method, *args, &block) 
    @source.send(method, *args, &block) 
    end 

    def own_method 
    puts "Hi." 
    end 

end 

t = Test_OS.new 
t.foo = 1 
p t.foo #=> 1 
t.own_method #=> Hi. 
+1

Se si esegue questa operazione, è possibile che si desideri esaminare la classe delegate dalla libreria standard anziché eseguire il rollover personale: http://www.ruby-doc.org/stdlib-1.9.3/libdoc /delegate/rdoc/index.html –

1

Dal OpenStruct non è un modulo, e non è possibile causare i moduli di ereditare dalle classi, sarà necessario scrivere il proprio modulo che utilizza method_missing per implementare le capacità OpenStruct. Per fortuna, questo è pochissimo lavoro. L'intera classe OpenStruct contiene solo 80 righe di codice e la maggior parte di queste probabilmente non ne ha nemmeno bisogno.

C'è un motivo valido per il quale si desidera fare affidamento su OpenStruct stesso?

Problemi correlati