使用 splat 运算符的任意关键字参数

你可以使用 double splat**)运算符定义接受任意数量的关键字参数的方法 :

def say(**args)
  puts args
end

say foo: "1", bar: "2"
# {:foo=>"1", :bar=>"2"}

这些论点都是在 Hash 中捕获的。你可以操作 Hash,例如提取所需的参数。

def say(**args)
  puts args[:message] || "Message not found"
end

say foo: "1", bar: "2", message: "Hello World"
# Hello World

say foo: "1", bar: "2"
# Message not found

使用带有关键字参数的 splat 运算符将阻止关键字参数验证,在未知关键字的情况下,该方法永远不会引发 ArgumentError

对于标准 splat 运算符,你可以将 Hash 重新转换为方法的关键字参数:

def say(message: nil, before: "<p>", after: "</p>")
  puts "#{before}#{message}#{after}"
end

args = { message: "Hello World", after: "</p><hr>" }
say(**args)
# <p>Hello World</p><hr>

args = { message: "Hello World", foo: "1" }
say(**args)
# => ArgumentError: unknown keyword: foo

当你需要操作传入的参数并将它们传递给基础方法时,通常会使用此方法:

def inner(foo:, bar:)
  puts foo, bar
end

def outer(something, foo: nil, bar: nil, baz: nil)
  puts something
  params = {}
  params[:foo] = foo || "Default foo"
  params[:bar] = bar || "Default bar"
  inner(**params)
end

outer "Hello:", foo: "Custom foo"
# Hello:
# Custom foo
# Default bar