0

以下のコードでは、redis キューから読み取りd、redis 操作の完了時にローカルの遅延可能な変数でコールバックをトリガーします。

f正常に動作しますが、メソッドが返されたときに変数dがスコープ外になるため、エラーが発生すると予想していました。それともそうですか?

なぜこれが機能するのですか?dクロージャーを作成し、これらのクロージャーがd生き続けるブロックを使用しているためですか?

require 'em-hiredis'

def f
  d = EM::DefaultDeferrable.new

  EM::Hiredis.connect.blpop('abcdef', 5).
    callback {|x| d.succeed x}.
    errback {|e| d.fail e}

  d.
    callback {|x| puts "value=#{x}"}.
    errback {|e| puts "error #{e}"}

  return nil
end

EM.run {f}

編集: EM::Hiredis インスタンスもローカルであり、ブロックがアタッチされていることに注意してください。f が戻ると、redis 接続でブロックがなくなるはずではありませんか?

4

1 に答える 1

0

Ruby ブロックが興味深いのは、それらが定義されているスコープへのバインディングが含まれているからです。

これは、ブロックが他の場所で/後で実行された場合でも、遅延可能オブジェクトがブロック内にバインドされ、ブロックで使用できることを意味します。

于 2013-02-06T17:40:31.967 に答える