1. ホーム
  2. ruby

Rubyで "コールバック "を実装するには?

2023-09-07 21:42:46

質問

RubyでC言語スタイルのコールバックを行うための最良のイディオムがわかりません。C言語では、私は次のようなことをします。

void DoStuff( int parameter, CallbackPtr callback )
{
  // Do stuff
  ...
  // Notify we're done
  callback( status_code )
}

Rubyの良い同等品は何ですか?基本的には、私は"DoStuff"内で特定の条件が満たされたときに、渡されたクラスメソッドを呼び出したいと思っています。

どのように解決するのですか?

慣用的ではありませんが、rubyに相当するものは、次のようになります。

def my_callback(a, b, c, status_code)
  puts "did stuff with #{a}, #{b}, #{c} and got #{status_code}"
end

def do_stuff(a, b, c, callback)
  sum = a + b + c
  callback.call(a, b, c, sum)
end

def main
  a = 1
  b = 2
  c = 3
  do_stuff(a, b, c, method(:my_callback))
end

慣用的なアプローチは、メソッドへの参照ではなくブロックを渡すことでしょう。ブロックが独立したメソッドと比較して持つ一つの利点は、コンテキストです - ブロックは のクロージャです。 であり、宣言されたスコープから変数を参照することができます。このため、do_stuffがコールバックに渡すべきパラメータの数を減らすことができます。たとえば

def do_stuff(a, b, c, &block)
  sum = a + b + c
  yield sum
end

def main
  a = 1
  b = 2
  c = 3
  do_stuff(a, b, c) { |status_code|
    puts "did stuff with #{a}, #{b}, #{c} and got #{status_code}"
  }
end