0

あなたがそのような方法を持っているとしましょう:

def log_yield(sql, args=nil)
  sql = "#{sql}; #{args.inspect}" if args
  t0 = Time.now
  begin
    yield
  rescue => e
    log_exception(e, sql)
    raise
  ensure
    t1 = Time.now
    log_duration(Integer((t1-t0)*1000), sql) unless e
  end
end

このメソッドをオーバーライドして同様の方法で実装する必要がありますが、によって返されるブロックを取得する必要がありますyield

(具体的には、Sequel :: Databaseで特定のSQLを生成したブロックを特定する必要があります)

4

1 に答える 1

0

ブロックは単に美化されたパラメーターです。メソッドでは、ルビーの実装によって追加されますが、一般に、メソッドを次のように定義できます。

def log_yield(sql, args=nil, &block)
    # do whatever you want with the block here
end

もちろん、継承されたクラスで必要に応じて自由にオーバーライドできます。ブロックが提供されていない場合は、 を使用してメソッド内のロジックを変更することもできますblock_given?

于 2013-03-09T00:41:39.893 に答える