RubyでCoffeeScriptっぽい?コールバックを書く

Ruby Weeklyより。Callbacks and Rubyという記事でRubyでCoffeeScriptっぽい?コールバックを書く例が紹介されていて、あんまりRubyでは見ないコードなので面白いなーと思いました。

どんなコードなの?

こんなコード。そこはかとなくCoffeeScriptぽい。

Payments::ChargeCreditCard.new(credit_card_params, payment_options).run(
  on_success: -> (response) {
    response.amount
    response.transaction_id
  },
  on_failure: -> (response) {
    response.failure_message
  }
)

Rubyでよく見るのはこんな感じに、ブロックで書く感じのコードだと思います。

Payments::ChargeCreditCard.new(credit_card_params, payment_options).run do |response|
  if response.success?
    response.amount
    response.transaction_id
  else
    response.failure_message
  end
end

ハッシュで書く利点は可読性が上がる点だと思うのですが、反面「on_success、on_failureというキーと値を設定しなければならない」というインターフェースが定義されているわけではないので、ドキュメントなどを用意しないと使い方がわかりにくい、というのが難点な気がします。

これはJavaScriptでも同じなんですが、JavaScriptの場合はよくあるパターンすぎて一般的になっているのに対して、Rubyだとあんまり見ないので、ギョっとしてしまいますね。

ObjectiveCでもよくあるコードですが、ObjectiveCの場合は型宣言があるので、読み解きやすいです。

そんな感じで善し悪しのあるコードではありますが、使いどころのあるテクニックではあります。具体的な実装方法については、Callbacks and Rubyをご覧ください。