Ruby Language Utilisation d'arguments de mots clés arbitraires avec l'opérateur splat


Exemple

Vous pouvez définir une méthode pour accepter un nombre arbitraire d'arguments par mot clé en utilisant l'opérateur double splat ( ** ):

def say(**args)
  puts args
end

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

Les arguments sont capturés dans un Hash . Vous pouvez manipuler le Hash , par exemple pour extraire les arguments souhaités.

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

L'utilisation d'un opérateur splat avec des arguments de mot-clé empêchera la validation des arguments, la méthode ne déclenchera jamais une ArgumentError en cas de mot-clé inconnu.

En ce qui concerne l'opérateur splat standard, vous pouvez reconvertir un Hash en arguments de mots-clés pour une méthode:

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

Ceci est généralement utilisé lorsque vous devez manipuler des arguments entrants et les transmettre à une méthode sous-jacente:

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