Вызовите метод класса в потоке - PullRequest
2 голосов
/ 30 января 2011
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. Как я могу вызвать метод foo из класса B?

1 Ответ

3 голосов
/ 30 января 2011

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

Я хочу начать новую тему с классом A

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

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

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

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

, хотя комментарий о вызове 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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...