想到已经有了答案,但找不到答案。我一直在做方法选项解析某种方式,并希望检查并确保它是最优雅/简洁的方式。
这就是我一般所做的事情:
def some_method *args
options = args.extract_options!
options.assert_valid_keys(:key1, :key2)
defaults = {:key1 => "one", :key2 => "two"}
options = defaults.merge(options)
general_arguments = args[0]
这显然是为了让我有方法调用,如:
some_method @user.id, :key1 => "good"
这是有效的,但对于Ruby来说似乎有点冗长,因为这是我的“一般模式”,我想知道它是否真的是我应该这样做的方式。做一般选项解析是否有更好,更简洁的方法或“更多Rubyesque”方式?
答案 0 :(得分:1)
我认为这实际上取决于调用此方法的人或者是什么。如果它是一个私有方法,那么这肯定是矫枉过正的,因为所有对它的调用都将被封装。另一方面,如果它是您正在发布的某个gem中的公共API的一部分,那么我认为这种防御方法是合适的。
如果您的用例位于中间位置,您可能希望采用一种防御性稍差但略显明确的方法。以下是我在方法公开时往往会遵循的模式,但只有有限数量的调用者。它需要固定数量的“常规参数”,以及少量具有默认值的选项。
def my_method(id, options={})
# Set default options
options[:my_option] ||= "default option"
# rest of your method goes here
end