我發現自己經常使用命名參數爲方法編寫我認爲不需要的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