我发现自己经常使用命名参数为方法编写我认为不需要的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"
我真的不喜欢这个代码是什么,我不得不采取指定参数和值传递到本地变量违背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]代码加载启动我的命名参数方法?
听起来像你真正想要的是命名参数。这些存在于Ruby 2.0中。 – Ajedi32 2013-08-18 14:03:34