私はBasicObjectプロキシを使用しています。実際のオブジェクトまたはそのようなプロキシを渡したかどうかを検出する必要があります。問題は、このようなis_a?
やclass
ような方法は、これは私がそれを使用しています方法の例ですBasicObjectプロキシを検出するにはどうすればいいですか?
module ControllerProxyable
extend ActiveSupport::Concern
included do
attr_reader :controller
delegate :current_user, to: :controller
end
def controller_proxy(controller)
# is_a? actually is NOT defined for a BasicObject causes the following to crash
@controller = if controller.is_a?(ControllerProxy)
controller
else
ControllerProxy.new(controller)
end
end
end
class ControllerProxy < BasicObject
def initialize(controller = nil)
@controller = controller
end
def some_proxy_method
end
# def respond_to and respond_to_missing not relevant here
end
定義されていないということです。
class Foo
include ControllerProxyable
def initialize(controller: nil)
controller_proxy(controller)
end
def bar
bar ||= Bar.new(controller: controller)
end
end
class Bar
include ControllerProxyable
def initialize(controller: nil)
controller_proxy(controller)
end
end
ので、以下は動作しませんが
Foo.new(controller: nil).bar.some_proxy_method
is_a?
をプロキシとして定義するにはどうすればよいですか?
これは、単に観察答えではありません:プロキシを使用しての全体のポイントは、プロキシがスタンドで本物のため何時の間にかとして使用することができるということです。 IOW:プロキシと実際のものを区別することはできません。実際、あなたが求める人に応じて、あるオブジェクトが別のオブジェクトを擬似的にシミュレートする能力は、OOPの中心またはOOP、または*定義*にさえあります。 –
@JörgWMittag問題は私のサービスでは本物のものよりもプロキシがほしいと思っていますが、実際のところはすでにプロキシであるかもしれません。 私はプロキシ以上にプロキシを持つことを避けたいのですが、それ自体問題ではないかもしれません。 –
私はこの質問が詐欺であるかどうかはわかりません。メソッドを 'Object'から再バインドすることも可能ですが、特にプロキシの場合は、独自の実装を提供する方が望ましいかもしれません。 –