que estoy tratando de hacer un objeto proxy que transfiere casi todos método llama a un objeto secundario, esencialmente el patrón delegante. En su mayor parte, estoy usando un BasicObject y pasando cada llamada con method_missing al objeto hijo. Hasta aquí todo bien.Fooling Ruby, ===, con objetos proxy
El truco es que por mucho que lo intente, no puedo engañar a operador caso de Ruby, así que no puedo hacer:
x = Proxy.new(15)
Fixnum === x #=> false, no matter what I do
Por supuesto, esto hace que cualquier case x
operaciones fallan, lo que significa que los proxies pueden No se entregará de forma segura a otras bibliotecas.
no puedo por la vida de mí averiguar lo === está utilizando. El proxy funciona bien para toda la introspección basada en la clase que conozco, que se pasa todo correctamente al objeto secundario:
x.is_a?(Fixnum) #=> true
x.instance_of?(Fixnum) #=> true
x.kind_of?(Fixnum) #=> true
x.class #=> Fixnum
Es Module#===
simplemente haciendo algún tipo de magia que no se puede evitar?
Una palabra de advertencia: si puede lograr su objetivo sin enmascarar su proxy como un 'Fixnum' al delegar' is_a? ',' Instance_of? ',' Kind_of? ',' Class' etc., ¡hágalo! Cambiar estos métodos puede llevarlo a usted (oa alguien que use/mantenga su código) directamente a la depuración del infierno. – molf