Me encuentro escribiendo constantemente lo que veo como código innecesario en Ruby cuando uso argumentos con nombre para los métodos.Argumentos con nombre como variables locales en Ruby
Tomemos como ejemplo el siguiente código:
def my_method(args)
orange = args[:orange]
lemon = args[:lemon]
grapefruit = args[:grapefruit]
# code that uses
# orange, lemon & grapefruit in this format which is way prettier & concise than
# args[:orange] args[:lemon] args[:grapefruit]
puts "my_method variables: #{orange}, #{lemon}, #{grapefruit}"
end
my_method :orange => "Orange", :grapefruit => "Grapefruit"
Lo que realmente no me gusta de este código es que estoy teniendo que tomar los argumentos y pasar los valores en variables locales ir en contra de los principios seco y justo generalmente ocupando espacio en mis métodos. Y si no uso las variables locales y solo me refiero a todas las variables con la sintaxis de args [: symbol], el código se vuelve algo ilegible.
He intentado encontrar una solución a esto pero seguir golpeando una pared de ladrillo ya que no sé cómo definir variables locales usando eval en el alcance del método, o usando cualquier otra técnica. Esto es uno de los muchos intentos por debajo, lo que resulta en un error
def my_method_with_eval(args)
method_binding = binding
%w{ orange lemon grapefruit}.each { |variable| eval "#{variable} = args[:#{variable}]", method_binding; }
# code that uses
# orange, lemon & grapefruit in this format which is way prettier & concise than
# args[:orange] args[:lemon] args[:grapefruit]
puts "my_method_with_eval variables: #{orange}, #{lemon}, #{grapefruit}"
end
my_method_with_eval :orange => "Orange", :grapefruit => "Grapefruit"
Cuando se ejecuta el código que simplemente obtener
NameError: undefined local variable or method ‘orange’ for main:Object method my_method_with_eval in named_args_to_local_vars at line at top level in named_args_to_local_vars at line 9
Alguien tiene alguna idea de cómo podría simplificar esta abajo de alguna manera para que yo no es necesario que inicie mis métodos de argumentos nombrados con cargas de código var = args [: var]?
Gracias, Matthew O'Riordan
Parece que lo que realmente quiere aquí se llama argumentos. Esos existen en Ruby 2.0. – Ajedi32