-1

電話をかけたい状況があります

foo.bar.baz arg1,arg2...argn

場合によっては baz が定義されないことがありますが、これは method_missing を使用してキャッチしますが、'bar' から返されたオブジェクトの method_missing から 'foo' に到達できるようにしたいと考えています。つまり、foo が参照しているオブジェクトの参照を取得したいのです。

私が推測できる解決策の 1 つは、呼び出しコンテキスト/親コンテキストのバインディング オブジェクトを取得できるかどうかです。つまり、 method_missing の内部から、呼び出し時点でのバインディング オブジェクトをそのまま取得します。foo.bar

だから私の質問は、method_missing からバックトラックできる方法はありますか (この場合は foo に)? 呼び出しをインストルメント化する必要がある場合は、それが解釈時に行われ、#extend などを使用しない限り問題ありません。キャッシュ/パフォーマンスに深刻な影響を与えます。

4

2 に答える 2

0
class MyFooClass
    attr_reader :value

    def initialize(value)
        @value = value
    end

        # In order to say foo.bar, the class of foo must define bar.
    def bar
        puts "bar sent to #{self}"
            # return a class where method_missing is defined,
            # and pass it a reference to foo
        MyBarClass.new(self)
    end
end # MyFooClass

class MyBarClass
    def initialize(foo)
        @foo = foo
    end

    def method_missing(name, *args, &block)
        puts "missing #{name} in #{self.class}"
        self.class.class_eval %Q{
            puts "about to define #{name}"
            def #{name}(*args)
                puts "in #{name} on self=#{self} with args=#{args}"
                puts "foo is #{@foo} and it's value is <#{@foo.value}>"
            end
        }
        puts "after define, execute #{name}"
        self.send(name, *args)
    end
end # MyBarClass

foo = MyFooClass.new('value of foo') # result of an expression
foo.bar.baz 'arg1' # define baz for future reference and execute it
print 'MyBarClass.instance_methods : '; p MyBarClass.instance_methods(false)

実行:

$ ruby -w t.rb
bar sent to #<MyFooClass:0x10195c750>
missing baz in MyBarClass
about to define baz
after define, execute baz
in baz on self=#<MyBarClass:0x10195c6b0> with args=arg1
foo is #<MyFooClass:0x10195c750> and it's value is <value of foo>
MyBarClass.instance_methods : ["baz", "method_missing"]
于 2013-01-17T21:47:32.943 に答える
0
def method_missing *_; self end
于 2013-01-17T15:11:48.587 に答える