Module#refine
metodo prende una classe e un blocco e restituisce un modulo di raffinatezza, così ho pensato che potrei definire:Un modo migliore per trasformare una classe di rubini in un modulo rispetto ai raffinamenti?
class Class
def include_refined(klass)
_refinement = Module.new do
include refine(klass) {
yield if block_given?
}
end
self.send :include, _refinement
end
end
e il seguente test viene superato
class Base
def foo
"foo"
end
end
class Receiver
include_refined(Base) {
def foo
"refined " + super
end
}
end
describe Receiver do
it { should respond_to(:foo) }
its(:foo) { should eq("refined foo") }
end
Quindi, utilizzando i parametri, posso girare una classe in un modulo, raffina il suo comportamento al volo e includilo in altre classi.
- C'è un modo più semplice per trasformare una classe in un modulo in Ruby (ad esempio in rubino < 2)?
Nel C-implementazione di rb_mod_refine vediamo
refinement = rb_module_new(); RCLASS_SET_SUPER(refinement, klass);
E 'solo l'impostazione della superclasse di raffinatezza a
klass
che copia l'implementazione della classe all'interno del modulo raffinatezza?- Sono a conoscenza del fatto che l'ereditarietà multipla è eseguita tramite moduli, ma cosa penserebbe la comunità sopra
Class#include_refined
? Sarebbe ragionevole estrapolare questo aspetto dai raffinamenti? "Localmente" l'applicazione di patch all'interno di una classe invece di utilizzare "usa" per attivare i perfezionamenti?
Sembra una soluzione insolita. Esistono casi di utilizzo pratico in Rails? –
@BillyChan Immagina di voler utilizzare tutte le azioni definite in alcune classi di controller definite in alcune gemme (o Rails :: Engine) nel mio controller, che naturalmente ereditano dal mio 'ApplicationController'. Prendi [Tolk :: LocalesController] (https://github.com/tolk/tolk/blob/master/app/controllers/tolk/locales_controller.rb) per esempio. –
Sono confuso sul perché vorresti farlo. Perché non definirlo come un modulo, e se hai bisogno di istanziare qualcosa con _solo quei metodi? Puoi creare una classe che non fa altro che includere i moduli. – prater