4

我有一个calculate(data)返回两个值的方法。一个是等级(Float),另一个是细节(Hash)。比较以下两个选项,有没有首选的方法?

def calculate(data)
  ...
  [grade, details]
end

grade, details = calculate(data)

对比

def calculate(data)
  ...
  Result.new(grade, details)
end

result = calculate(data)
grade = result.grade
details = result.details

Ruby 中哪个更惯用?

4

3 回答 3

4

对于打算在库内部使用的方法,您的第一个选项更有效,并且是一个不错的选择。对于打算由库用户使用的方法,类似于您的第二个选项的方法具有更理想的界面,应该使用。

于 2013-08-22T18:29:27.023 回答
4

数组形式更惯用。事实上,你可以通过 Ruby 内置的多重返回机制来做到这一点:

def calculate(data)
  ...
  return grade, details
end

grade, details = calculate(data)
于 2013-08-22T18:27:22.183 回答
3

两全其美的:

Result = Struct.new(:grade, :details) do
  def to_ary; [grade, details] end
end

def calculate(data)
  Result.new(1, 'Two')
end

grade, details = calculate(:ignore)
# => #<struct Result grade=1, details="Two">

grade
# => 1

details
# => 'Two'

作为一个实验,我曾经monkeypatchedHash#eachyieldaStruct.new(:key, :value)而不是两个元素Array,几乎所有我必须做的就是让大部分RubySpecs 再次通过就是实现to_ary.

于 2013-08-22T23:48:40.417 回答