2011-01-30 12 views
2
Class A 
    def foo 
    do s.t 
    end 
end 

class B 
    def initialize 
    @bar = Thread::new{ 
     A::new 
    } 
    #Here I want to call A.foo in the thread @bar 
    end 
end 

bar = B::new 

クラスAで新しいスレッドを開始したいのですが、どのようにしてクラスBのメソッドfooを呼び出すことができますか?スレッド内のクラスのメソッドを呼び出す

答えて

3

私はあなたの問題について混乱していると思います。まず、あなたは

は、私はクラス

で新しいスレッドを開始したいと言うが、あなたがそれで何を意味するかは不明です。あなたは 'クラス'でスレッドを開始することはできません。第二に、あなたは私が

@barスレッドでA.fooを呼びたいが、あなたはその時点で新しいスレッドで実行されているブロックの内側ではないよ。ここ

を言います。たとえあなたがいたとしても、クラスAのクラスメソッドfooはないので、A.fooNoMethodErrorになります。次にあなたはあなたにしたいと言っています

クラスBのメソッドfooを呼び出しますか?

のfooを呼び出すことについてのコメントはインスタンスであっても B.

だから、私は仮定していますが、以下の意味:今

Class A 
    def foo 
    end 
end 

class B 
    def initialize 
    @bar = Thread::new{ 
     a = A::new 
    } 
    # Here I want to call a.foo 
    end 
end 
bar = B::new 

、その場合には、問題は、作成したAの新しいインスタンスが、スレッド@barが実行するブロックに対してローカルであることです。これは作成したThreadインスタンスのインスタンス変数ではなく、そのインスタンスのメソッドにはアクセスできません。しかし、何を行うことができますことは、事前にそのインスタンスを作成し、スレッドと共有している:

class B 
    def initialize 
    a = A.new 
    @bar = Thread::new { 
     do_stuff_with a 
    } 
    a.foo 
    end 

これはうまく動作します。もちろん、並行性の問題と、スレッドの使用に関連するすべての問題が発生します。注意してください。

関連する問題