Я постоянно нахожу, что я вижу ненужный код в Ruby при использовании именованных аргументов для методов.
Возьмем, например, следующий код:
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"
То, что мне действительно не нравится в этом коде, заключается в том, что мне приходится принимать аргументы и передавать значения в локальные переменные, идущие против DRY-принципов и обычно занимая место в моих методах. И если я не использую локальные переменные и просто обращаюсь ко всем переменным с синтаксисом args [: symbol], тогда код становится несколько неразборчивым.
Я попытался разработать решение для этого, но не ударил кирпичную стену, так как не знаю, как определить локальные переменные, используя eval в рамках метода, или используя любую другую технику. Ниже приведена одна из многих попыток, которая приводит к ошибке
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"
При запуске этого кода я просто получаю
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
Кто-нибудь получил какие-либо идеи о том, как я мог бы упростить это так, чтобы мне не приходилось запускать мои методы с именами с нагрузками var = args [: var] code?
Спасибо, Мэтью О'Риордан