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