Я постоянно нахожу, что я рассматриваю ненужный код в Ruby при использовании именованных аргументов для методов.Именованные аргументы как локальные переменные в 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"
Что мне действительно не нравится этот код является то, что я имею принять арг и передать значения в локальных переменных идет против СУХИХ принципов и просто обычно занимая место в моих методах. И если я не использую локальные переменные и просто ссылаюсь на все переменные с синтаксисом 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]?
Спасибо, Matthew O'Riordan
Похоже, что вы действительно хотите здесь, это аргументы. Они существуют в Ruby 2.0. – Ajedi32