Ruby 返回两个元素:数组和结构

Ruby 返回两个元素:数组和结构,ruby,Ruby,我有一个方法calculate(data),它返回两个值。一个是等级(Float),另一个是详细信息(Hash)。比较以下两个选项,有没有更好的方法 def calculate(data) ... [grade, details] end grade, details = calculate(data) vs Ruby中什么更为惯用?数组形式更为惯用。事实上,您可以通过Ruby内置的多重返回机制来实现: def calculate(data) ... return grade

我有一个方法
calculate(data)
,它返回两个值。一个是等级(
Float
),另一个是详细信息
(Hash
)。比较以下两个选项,有没有更好的方法

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

grade, details = calculate(data)
vs


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'
Result=Struct.new(:grade,:details)do
定义为"ary",;[等级、细节]结束
结束
def计算(数据)
结果.新的(1,‘2’)
结束
等级,详细信息=计算(:忽略)
# => #
等级
# => 1
细节
#=>“两个”

作为一个实验,我曾经用monkeypatched
Hash#each
生成一个
Struct.new(:key,:value)
而不是一个两元素
数组
,为了让大部分RubySpec再次通过,我所要做的就是实现
,我不认为
返回等级,details
[grade,details]
@sawa更好,但更惯用。在可能的情况下省略
return
更惯用。我的观点是要说明Ruby特别允许将显式返回值打包到数组中。@sawa我同意,但这并不意味着这个建议无效。我把标题从“两个”概括为“多个”。你为什么把范围缩小到“2”?最好尽可能地保持一般性。我认为这会严重影响决策,因此我将其定制为两种情况。结构可以被飞溅:
Result=Struct.new(:grade,:details);等级,细节=*结果。新的(1,'2')
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'