Sto provando a creare un oggetto proxy che trasferisce quasi tutte le chiamate di metodo a un oggetto figlio, essenzialmente il modello del delegante. Per la maggior parte, sto solo usando un BasicObject e passando ogni chiamata con method_missing all'oggetto figlio. Fin qui tutto bene.Fooling Operatore del caso Ruby, ===, con oggetti proxy
Il trucco è che Per quanto mi sforzassi, non posso ingannare operatore caso di Ruby, quindi non posso fare:
x = Proxy.new(15)
Fixnum === x #=> false, no matter what I do
Questo, naturalmente, non forniscono alcuna case x
operazioni falliscono, il che significa che i proxy possono essere consegnato in sicurezza ad altre biblioteche.
Non riesco, per la vita di me, a capire cosa stia usando ===. Il proxy funziona bene per tutto l'introspezione class-based che conosco, che è tutto correttamente passato all'oggetto bambino:
x.is_a?(Fixnum) #=> true
x.instance_of?(Fixnum) #=> true
x.kind_of?(Fixnum) #=> true
x.class #=> Fixnum
È Module#===
solo facendo una sorta di magia che non può essere evitato?
Un avvertimento: se riesci a raggiungere il tuo obiettivo senza mascherare il tuo proxy come un 'Fixnum' delegando' is_a? ',' Instance_of? ',' Kind_of? ',' Class' ecc., Per favore fallo! Cambiare questi metodi può portare (o qualcuno che sta usando/mantenendo il tuo codice) direttamente al debug dell'inferno. – molf