Die anderen Antworten sind ziemlich gründlich und Closures in Ruby behandelt ausführlich die funktionalen Unterschiede. Ich war gespannt, welche Methode für Methoden, die optional einen Block akzeptieren , am besten geeignet ist, und schrieb daher einige Benchmarks (in diesem Beitrag von Paul Mucur ). Ich habe drei Methoden verglichen:
- & Methodensignatur blockieren
- Verwenden von
&Proc.new
yield
In einen anderen Block einwickeln
Hier ist der Code:
require "benchmark"
def always_yield
yield
end
def sometimes_block(flag, &block)
if flag && block
always_yield &block
end
end
def sometimes_proc_new(flag)
if flag && block_given?
always_yield &Proc.new
end
end
def sometimes_yield(flag)
if flag && block_given?
always_yield { yield }
end
end
a = b = c = 0
n = 1_000_000
Benchmark.bmbm do |x|
x.report("no &block") do
n.times do
sometimes_block(false) { "won't get used" }
end
end
x.report("no Proc.new") do
n.times do
sometimes_proc_new(false) { "won't get used" }
end
end
x.report("no yield") do
n.times do
sometimes_yield(false) { "won't get used" }
end
end
x.report("&block") do
n.times do
sometimes_block(true) { a += 1 }
end
end
x.report("Proc.new") do
n.times do
sometimes_proc_new(true) { b += 1 }
end
end
x.report("yield") do
n.times do
sometimes_yield(true) { c += 1 }
end
end
end
Die Leistung war zwischen Ruby 2.0.0p247 und 1.9.3p392 ähnlich. Hier sind die Ergebnisse für 1.9.3:
user system total real
no &block 0.580000 0.030000 0.610000 ( 0.609523)
no Proc.new 0.080000 0.000000 0.080000 ( 0.076817)
no yield 0.070000 0.000000 0.070000 ( 0.077191)
&block 0.660000 0.030000 0.690000 ( 0.689446)
Proc.new 0.820000 0.030000 0.850000 ( 0.849887)
yield 0.250000 0.000000 0.250000 ( 0.249116)
Das Hinzufügen eines expliziten &block
Parameters, wenn dieser nicht immer verwendet wird, verlangsamt die Methode wirklich. Wenn der Block optional ist, fügen Sie ihn nicht zur Methodensignatur hinzu. Und um Blöcke herumzugeben, ist das Einwickeln yield
in einen anderen Block am schnellsten.
Dies sind jedoch die Ergebnisse für eine Million Iterationen. Machen Sie sich also keine allzu großen Sorgen. Wenn eine Methode Ihren Code auf Kosten einer Millionstel Sekunde klarer macht, verwenden Sie sie trotzdem.