返回两个元素:数组与结构



我有一个返回两个值的方法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中什么更地道?

数组形式更为惯用。事实上,您可以通过Ruby内置的多次返回机制来实现:

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

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

两全其美:

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'

作为一个实验,我曾经将Hash#eachyield作为一个Struct.new(:key, :value)而不是两个元素的Array进行了猴痘匹配,为了让大多数RubySpec再次通过,我所要做的几乎就是实现to_ary