Я постоянно пишу то, что я считаю ненужным кодом в 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]?
Спасибо,
Мэтью О'Риордан