¿Puedo tener parámetros con nombre en Ruby 2.x?
arguments ruby-2.0 (5)
Combinando las soluciones de @awendt y @Adam,
def say(greeting: ->{ raise ArgumentError.new("greeting is required") }.call)
puts greeting
end
Puedes SECAR esto con algo como:
def required(arg)
raise ArgumentError.new("required #{arg}")
end
def say(greeting: required(''greeting''))
puts greeting
end
Y combinando eso con la solución de @Marc-Andre: gist.github.com/rdp/5390849
Ruby 2.0 está agregando parámetros nombrados, como este:
def say(greeting: ''hi'')
puts greeting
end
say # => puts ''hi''
say(greeting: ''howdy'') # => puts ''howdy''
¿Cómo puedo usar parámetros con nombre sin dar un valor predeterminado, para que sean necesarios?
En Ruby 2.3, puedo hacer
def say(greeting:)
puts greeting
end
Entonces úsalo con ...
say(greeting: "hello there")
En el momento actual (Ruby 2.0.0-preview1) puede usar la siguiente firma de método:
def say(greeting: greeting_to_say)
puts greeting
end
greeting_to_say
es solo un marcador de posición que no se evaluará si proporciona un argumento al parámetro nombrado. Si no lo pasa (llamando simplemente a say()
), ruby generará el error:
NameError: undefined local variable or method `greeting_to_say'' for (your scope)
Sin embargo, esa variable no está vinculada a nada, y por lo que puedo decir, no se puede hacer referencia desde su método. Aún usaría greeting
como la variable local para hacer referencia a lo que se pasó para el parámetro nombrado.
Si realmente fuera a hacer esto , le recomendaría usar def say(greeting: greeting)
para que el mensaje de error haga referencia al nombre que le está dando a su parámetro. Solo elegí diferentes en el ejemplo anterior para ilustrar lo que Ruby usará en el mensaje de error que recibas por no proporcionar un argumento al parámetro nombrado requerido.
De manera tangencial, si llama a say(''hi'')
ruby generará ArgumentError: wrong number of arguments (1 for 0)
lo que creo que es un poco confuso, pero solo es vista previa1.
No hay una forma específica en Ruby 2.0.0, pero puedes hacerlo Ruby 2.1.0 , con una sintaxis como def foo(a:, b:) ...
En Ruby 2.0.x, puede imponerlo colocando cualquier expresión que genere una excepción, por ejemplo:
def say(greeting: raise "greeting is required")
# ...
end
Si planeas hacer esto mucho (y no puedes usar Ruby 2.1+), podrías usar un método de ayuda como:
def required
method = caller_locations(1,1)[0].label
raise ArgumentError,
"A required keyword argument was not specified when calling ''#{method}''"
end
def say(greeting: required)
# ...
end
say # => A required keyword argument was not specified when calling ''say''
Qué tal si:
def say(greeting: nil)
greeting or raise ArgumentError
puts greeting
end
say # => raises ArgumentError
say(greeting: ''howdy'') # => puts ''howdy''
Aparte de eso, va a ser difícil. Según este sitio , los argumentos de palabras clave "son parámetros nombrados que tienen valores predeterminados".