使用 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