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