2011-01-30 2 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 

Я хочу начать новый поток с класса А. Как я могу назвать метод foo из класса B?Вызов метода класса в потоке

ответ

3

Я думаю, вы смущены своей проблемой. Во-первых, вы говорите

Я хочу, чтобы начать новую нить с класса А

, но не ясно, что вы имеете в виду под этим. Вы не можете запустить поток 'с' классом. Во-вторых, вы говорите

Здесь я хочу вызвать A.foo в потоке @bar

но вы не внутри блока, который выполняется в новой нити в этой точке. Даже если бы вы были, не существует метода класса «foo» класса A, поэтому A.foo приведет только к NoMethodError. Тогда вы говорите, что хотите

вызов метода foo из класса B?

даже если комментарий о вызове Foo находится в например Б.

Итак, я предполагаю, что вы имеете в виду следующее:

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 

Это будет работать нормально. Конечно, вы сталкиваетесь с адвентизмом и всеми проблемами, связанными с использованием потоков. Осторожно.

Смежные вопросы