我有一个返回两个值的方法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中有什么更惯用的东西?
答案 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
。