返回两个元素:Array与Struct

时间:2013-08-22 18:21:04

标签: ruby

我有一个返回两个值的方法calculate(data)。一个是成绩(Float),另一个是详细信息(Hash)。比较以下两个选项,有一种首选方式吗?

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

grade, details = calculate(data)

VS

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

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

Ruby中有什么更惯用的东西?

3 个答案:

答案 0 :(得分:4)

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

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

grade, details = calculate(data)

答案 1 :(得分:4)

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

答案 2 :(得分: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'

作为一项实验,我曾将Hash#each简化为yield一个Struct.new(:key, :value)而不是两个元素Array,而且几乎所有我必须做的才能获得大部分再次传递的RubySpecs是实现to_ary