我有一个返回两个值的方法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#each
和yield
作为一个Struct.new(:key, :value)
而不是两个元素的Array
进行了猴痘匹配,为了让大多数RubySpec再次通过,我所要做的几乎就是实现to_ary
。