あるメソッドから別のメソッドにブロックを渡す必要があります(私のメソッドにブロックが渡されたRails.cache.fetch
を呼び出したい)。ブロックをあるメソッドから別のメソッドに渡す
&block
をパラメータリストに追加し、それを次のメソッドに渡すか、新しいブロックを作成してその内部にyieldをコールすることができます。 { yield }
アプローチははるかに高速であるように
require "benchmark"
def with_block(&block)
do_something 'Test', &block
end
def with_yield
do_something('Test') { yield }
end
def do_something(string)
"#{yield} #{string}"
end
n = 5_000_000
Benchmark.bmbm do |x|
x.report("&block") do
n.times { with_block { "Yo" } }
end
x.report("yield") do
n.times { with_yield { "Yo" } }
end
end
&block 3.320000 0.010000 3.330000 ( 3.340438)
yield 1.670000 0.000000 1.670000 ( 1.669504)
--------------------------------- total: 5.000000sec
user system total real
&block 3.270000 0.010000 3.280000 ( 3.275914)
yield 1.680000 0.000000 1.680000 ( 1.682768)
が見える:私は簡単な例とベンチマークを書いてきました。それは正しい方法ですか?新しく作成されたブロックの中にyield
を呼び出すことで、私が気付いていない問題はありますか?
あなたには 'Proc'と特殊な' Proc'があり、これも 'lambda'で使えます。 メソッドもブロックですが、最初はオブジェクトではありません。メソッドを 'Method'オブジェクトに変換することができます。 ブロックを渡す2つの方法以外にも選択肢があります。だから私はあなたの質問は多少不完全だと思う。 Procsとlambdaの両方が「匿名」と考えられていますが、名前でアクセスしている以外は(匿名ブロック以外の)匿名ブロックを渡すことは特にありません。 – vgoff
'yield 'は実際より速いです。正確には機能が少ないからです。渡されたブロックのみを呼び出すことができます。たとえば、次のメソッドに渡すことはできません。あなたのテストは意味がありません、btw。 'do_something'はブロックを使用しません。 –
@SergioTulentsevあなたはそれを呼び出して渡すことができます。 'class Array; def my_map;マップ{| e |収量(e)}終了点。 – sawa