ruby arguments ruby-2.0 ruby-2.1

¿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".