Я пытаюсь создать прокси-объект, который передает почти все вызовы методов дочернему объекту, по сути, шаблону делегатора. По большей части я просто использую BasicObject и передаю каждый вызов с method_missing дочернему объекту. Все идет нормально.
Хитрость в том, что как бы я ни старался, я не могу обмануть оператор case Ruby, поэтому я не могу сделать:
x = Proxy.new(15)
Fixnum === x #=> false, no matter what I do
Это, конечно, приводит к сбою любых case x
операций, что означает, что прокси-серверы не могут быть безопасно переданы другим библиотекам.
Я не могу понять, что использует ===. Прокси отлично работает для всей известной мне интроспекции на основе классов, которая правильно передается дочернему объекту:
x.is_a?(Fixnum) #=> true
x.instance_of?(Fixnum) #=> true
x.kind_of?(Fixnum) #=> true
x.class #=> Fixnum
Module#===
просто творит какую-то магию, которой нельзя избежать?
Fixnum
, делегируяis_a?
,instance_of?
,kind_of?
,class
и т. д., сделайте это! Изменение этих методов может привести вас (или кого-то, кто использует/поддерживает ваш код) прямо в ад отладки. - person molf   schedule 20.08.2010