От Ruby 2.5.1 двойният splat оператор (**options
, например) все още е значително по-бавен от приемането на нормален аргумент и задава по подразбиране празен хеш.
Ето един прост показател:
require "benchmark/ips" def option_hash(options = {}); end def double_splat(**options); end Benchmark.ips do |x| x.report("option_hash") { option_hash(foo: 1, bar: 2) } x.report("double_splat") { double_splat(foo: 1, bar: 2) } end
... и резултат (по-голямото число е по-добро):
Warming up -------------------------------------- option_hash 123.232k i/100ms double_splat 61.146k i/100ms Calculating ------------------------------------- option_hash 1.798M (± 3.6%) i/s - 8.996M in 5.011461s double_splat 708.545k (± 5.4%) i/s - 3.546M in 5.020927s
Каква е оптималната употреба на двоен сплат?
Трябва да използвате двоен знак в дефиницията на метода само ако този метод дефинира незадължителни аргументи.
# This is a valid use case since otherwise Ruby will set a hash # in argument name `optional`. def valid_use_of_double_splat(optional = nil, **options) # Both of these use case can just use `options = {}` def perform_delivery(recipient:, **options) def associate_user(user, **options)