Buscar..


Observaciones

Los argumentos de palabras clave se introdujeron en Ruby 2.0 y se mejoraron en Ruby 2.1 con la adición de los argumentos de palabras clave requeridos .

Un método simple con un argumento de palabra clave se parece al siguiente:

def say(message: "Hello World")
  puts message
end

say
# => "Hello World"

say message: "Today is Monday"
# => "Today is Monday"

Como recordatorio, el mismo método sin argumento de palabra clave habría sido:

def say(message = "Hello World")
  puts message
end

say
# => "Hello World"

say "Today is Monday"
# => "Today is Monday"
2.0

Puede simular argumentos de palabras clave en versiones anteriores de Ruby usando un parámetro Hash. Esta sigue siendo una práctica muy común, especialmente en las bibliotecas que proporcionan compatibilidad con las versiones de Ruby anteriores a 2.0:

def say(options = {})
  message = options.fetch(:message, "Hello World")
  puts 
end

say
# => "Hello World"

say message: "Today is Monday"
# => "Today is Monday"

Usando argumentos de palabras clave

Para definir un argumento de palabra clave en un método, especifique el nombre en la definición del método:

def say(message: "Hello World")
  puts message
end

say
# => "Hello World"

say message: "Today is Monday"
# => "Today is Monday"

Puede definir múltiples argumentos de palabras clave, el orden de definición es irrelevante:

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

say
# => "<p>Hello World</p>"

say message: "Today is Monday"
# => "<p>Today is Monday</p>"

say after: "</p><hr>", message: "Today is Monday"
# => "<p>Today is Monday</p><hr>"

Los argumentos de palabras clave se pueden mezclar con argumentos posicionales:

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

say "Hello World", before: "<span>", after: "</span>"
# => "<span>Hello World</span>"

Mezclar el argumento de palabras clave con un argumento posicional era un enfoque muy común antes de Ruby 2.1, porque no era posible definir los argumentos de palabras clave requeridos .

Además, en Ruby <2.0, era muy común agregar un Hash al final de una definición de método para usar para argumentos opcionales. La sintaxis es muy similar a los argumentos de palabras clave, hasta el punto en que los argumentos opcionales a través de Hash son compatibles con los argumentos de palabras clave de Ruby 2.

def say(message, options = {})
  before = option.fetch(:before, "<p>")
  after  = option.fetch(:after, "</p>")
  puts "#{before}#{message}#{after}"
end

# The method call is syntactically equivalent to the keyword argument one
say "Hello World", before: "<span>", after: "</span>"
# => "<span>Hello World</span>"

Tenga en cuenta que al intentar pasar un argumento de palabra clave no definido se generará un error:

def say(message: "Hello World")
  puts message
end

say foo: "Hello"
# => ArgumentError: unknown keyword: foo

Argumentos de palabras clave requeridos

2.1

Los argumentos de palabras clave requeridos se introdujeron en Ruby 2.1, como una mejora de los argumentos de palabras clave.

Para definir un argumento de palabra clave según sea necesario, simplemente declare el argumento sin un valor predeterminado.

def say(message:)
  puts message
end

say
# => ArgumentError: missing keyword: message

say message: "Hello World"
# => "Hello World"

También puede mezclar argumentos de palabras clave requeridos y no requeridos:

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

say
# => ArgumentError: missing keyword: message

say message: "Hello World"
# => "<p>Hello World</p>"

say message: "Hello World", before: "<span>", after: "</span>"
# => "<span>Hello World</span>"

Usando argumentos arbitrarios de palabras clave con el operador splat

Puede definir un método para aceptar un número arbitrario de argumentos de palabras clave utilizando el operador de doble splat ( ** ):

def say(**args)
  puts args
end

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

Los argumentos son capturados en un Hash . Puede manipular el Hash , por ejemplo, para extraer los argumentos deseados.

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

El uso del operador splat con argumentos de palabras clave evitará la validación de los argumentos de palabras clave, el método nunca generará un ArgumentError en caso de palabras clave desconocidas.

En cuanto al operador splat estándar, puede volver a convertir un Hash en argumentos de palabras clave para un método:

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

Generalmente se usa cuando necesita manipular los argumentos entrantes y pasarlos a un método subyacente:

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


Modified text is an extract of the original Stack Overflow Documentation
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow