Ruby中最简洁/优雅/适当的方法参数解析

时间:2012-03-10 19:43:37

标签: ruby methods arguments

想到已经有了答案,但找不到答案。我一直在做方法选项解析某种方式,并希望检查并确保它是最优雅/简洁的方式。

这就是我一般所做的事情:

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”方式?

假设

  • 积极保护 - 我假设方法是通过gem或gemizable插件提供的公共API
  • 主要需要默认值以查看其他人使用的模式
  • 可能接受多个预先哈希的非命名参数

1 个答案:

答案 0 :(得分:1)

我认为这实际上取决于调用此方法的人或者是什么。如果它是一个私有方法,那么这肯定是矫枉过正的,因为所有对它的调用都将被封装。另一方面,如果它是您正在发布的某个gem中的公共API的一部分,那么我认为这种防御方法是合适的。

如果您的用例位于中间位置,您可能希望采用一种防御性稍差但略显明确的方法。以下是我在方法公开时往往会遵循的模式,但只有有限数量的调用者。它需要固定数量的“常规参数”,以及少量具有默认值的选项。

def my_method(id, options={})
  # Set default options
  options[:my_option] ||= "default option"

  # rest of your method goes here
end