2013-10-19 15 views
10
module X 
end 

module Y 
end 

module Z 
    #TODO include X replacement of including Y 
    #TODO include Y replacement of including X 
end 

C'è un modo per aggirare il fatto che il rubino non contenga una parola chiave non inclusa ??Ruby 2.0 Come faccio a non includere un modulo in uscita da un modulo dopo averlo incluso?

enter image description here

+0

possibile duplicato di [Qual è l'opposto di Ruby di includere?] (http://stackoverflow.com/questions/2088211/what-is-the-opposite-of-rubys-include) –

+0

@LoganSerman ruby ​​2.0 risposta Cerco – zotherstupidguy

+0

* include la sostituzione X di includere Y * significa? –

risposta

5

Se davvero bisogno di questo tipo di funzionalità, probabilmente si potrebbe farlo utilizzando refinements.

1

Non sono molto contento di questo, ma funziona se entrambi i moduli contengono gli stessi nomi di metodo.

lima c.rb

module A 
    def me 
    puts "I am C" 
    end 
    def whosit? 
    puts "It's me, Becky" 
    end 
end 

lima d.rb

module A 
    def me 
    puts "I am D" 
    end 
end 

Poi

class X 
    load('c.rb') 
    include A 
end 

x = X.new 

x.me # => I am C 
x.whosit? # => It's me, Becky 
load('d.rb') 
x.me # => I am D 
x.whosit? # => It's me, Becky !! Unwanted !! 
load('c.rb') 
x.me # => I am C 

load() è solo l'apertura modulo A e della sostituzione e/o aggiunta di codice; tutto ciò che non tocca rimane. load() non è molto luminoso. Penso che fondamentalmente fa un eval() e potrebbe importare di meno se carica lo stesso file più di una volta.

Per utilizzare questo, non anche require c.rb o d.rb.

Modifica: in una modifica precedente ho aggiunto un'osservazione su require_relative. Riflettendomi, vedo che non era né rilevante né interessante, quindi fuori di testa.

1

La vera risposta è che in Ruby, sia 1.xo 2.x, c'è in nessun modo per non includere un modulo una volta incluso. Ma so che qualcuno, da qualche parte, ha scritto un'estensione di Ruby che consente moduli non compresi.

EDIT: OK, in realtà, OP è il duplicato di What is the opposite of Ruby's include?, quindi in base alla risposta da @eliah e banister le librerie in questione sono https://github.com/yrashk/rbmodexcl e https://github.com/banister/mixology19

+0

Boris è troppo vecchio come mixology - si aspettano problemi e io non sono all'altezza delle sfide C, sto controllando davogones e risposte cary , il carico è una soluzione intelligente, la raffinatezza è più pulita. se la raffinatezza ha funzionato per me, farò sicuramente sapere al mondo che è necessario! – zotherstupidguy

+0

Hai assolutamente ragione. Non ho provato quelle librerie. Penso che ci debba essere una ragione per cui Matz non ha fornito questa funzionalità in primo luogo. –

Problemi correlati