2011-12-16 2 views
1

RubyのEventMachine.popenには、グローバルモジュールベースのハンドラが必要なようです。地元のハンドラを持っていることは不可能と思われるので、これは例えば、過剰です:ローカルハンドラでEventMachine.popenを呼び出す

def local_run(cmd) 
    q = EventMachine::Queue.new 
    module Handler 
    def receive_data data 
     q.push data 
    end 
    end 
    EM.system(cmd, Handler) 
    q 
end 

上記のコードが実行されないでしょう。ルビーが文句を言うmodule definition in method body (SyntaxError)

EM.systemのローカルハンドラを定義する方法はありますか?

気になるのは、ローカルコマンドを非同期で実行し、STDOUTデータを含むキューを返すことです。

答えて

2

EM.run {}を使用せずにEMコマンドを使用することはできません。コマンドが送信されず、データが受信されず、コールバックが起動されません。

ほとんどのEMコードはモジュールを使用できますが、クラスを使用することも、関数を呼び出すときに定義することもできます。同じことを(しかしは、あなたの質問でキューとしてカスタム引数を受け入れることができない)やるべき

EM.popen("ls -l") do |p| 
    def p.receive_data(data) 
    puts data 
    end 
end 

あなたのような何かを行うことができます。

あなたはまた、(キューで、この時間)を行うことができるはず:

class Foo < EM::Connection 
    def initialize(q) 
    @q = q 
    end 
    def receive_data(data) 
    @q.push data 
    end 
end 
EM.popen("ls -l", Foo, EventMachine::Queue.new) 
+0

私はEM.runを使用しないことについて何も言わなかったが、良いは、ハンドラ関数を定義する方法があることを知っていますローカルに。残念ながら、あなたの 'receive_data'は親スコープの変数にアクセスできないようです。 https://gist.github.com/1498155#commentsを参照してください。他のEM非同期ハンドラでこの問題が発生したことはありません。このため、このアプローチを自分のコードで使用することはできません。 –

+0

最後に、 'class'を使った2番目の例は、(' ** ** ** 'の中から ''すべてのことを)覚えています。 ''メソッド本体のクラス定義(SyntaxError) 'につながります。私が "地方"を意味するのは、質問の中で**機能**のローカルスコープです。 –

+0

ああ、私は上記の「EventMachineループなし」のコメントを正しく解釈しなかった。 EM.runの使用を計画していなかったようです。 – dj2

関連する問題