Ruby 定义新API时将struct用作参数的优缺点

Ruby 定义新API时将struct用作参数的优缺点,ruby,api,parameters,struct,Ruby,Api,Parameters,Struct,我正在编写的API是为从ActiveRecord继承的Ruby类编写的。我试图编写静态方法以避免ActiveRecord实例泄漏。所有API现在都需要元组来唯一标识数据库行 使用以下形式的API是一个好主意: API1(abc、def等) API2(abc、def等) 等等 或者我应该定义一个带有字段的结构来帮助将来的更改 任何其他想法都是非常受欢迎的 在Ruby中使用struct会很奇怪,散列是正常的: def self.api1(options) # Look at options[

我正在编写的API是为从ActiveRecord继承的Ruby类编写的。我试图编写静态方法以避免ActiveRecord实例泄漏。所有API现在都需要元组来唯一标识数据库行

使用以下形式的API是一个好主意:

API1(abc、def等) API2(abc、def等) 等等

或者我应该定义一个带有字段的结构来帮助将来的更改


任何其他想法都是非常受欢迎的

在Ruby中使用struct会很奇怪,散列是正常的:

def self.api1(options)
    # Look at options[:abc], options[:def], ...
end
然后可以使用如下命名参数调用它:

C.api1 :abc => 'abc', :def => '...'

易于扩展,常见的Ruby实践,并且易于使某些参数可选。

要继续mu所描述的,一个常见的Ruby习惯用法,您将看到它让一个方法为自己设置一些默认选项,然后将该方法收到的选项合并到该散列中。通过这种方式,您可以确保始终存在一些最小的选项列表:

def self.api1(options={})
  default_options = { :foo => 'bar', :baz => nil }
  options = default_options.merge options
  # Now include your code and you can assume that options[:foo] and options[:bar] are there
end

例如,当您的方法输出
:baz
的值时,这会很方便。现在,您不需要先检查它是否存在,只需输出它,就可以知道它始终存在。

感谢您使用哈希的想法。在我的例子中,这些参数不是真正的可选参数,因为它们唯一地标识数据库记录。@Smitten:您不必调用它们选项,您可以(而且应该)验证您需要的一切都在那里。使用散列是处理长参数列表的一种简单方法。您可以使用一个或多个参数列表,但如果有多个参数,则列表将变得非常笨拙。OTOH,Ruby会抱怨使用简单位置参数的参数数量错误。也会感谢设计输入。使用散列而不是单个参数的想法在某种程度上是好还是坏?