从方法中返回两个或更多的值

有没有可能从方法返回多个值? 像这样的东西:

def do() return ["a", 10, SomeObject.new] end [a, b, c] = do 
 def sumdiff(x, y) return x+y, xy end #=> nil sumdiff(3, 4) #=> [7, -1] a = sumdiff(3,4) #=> [7, -1] a #=> [7, -1] a,b=sumdiff(3,4) #=> [7, -1] a #=> 7 b #=> -1 a,b,c=sumdiff(3,4) #=> [7, -1] a #=> 7 b #=> -1 c #=> nil 

Ruby具有解构绑定的有限forms:

 ary = [1, 2, 3, 4] a, b, c = ary pa # => 1 pb # => 2 pc # => 3 a, b, *c = ary pc # => [3, 4] a, b, c, d, e = ary pd # => 4 pe # => nil 

它也有一个有限的结构绑定forms:

  a = 1, 2, 3 pa # => [1, 2, 3] 

你可以把这两种forms结合起来:

 a, b = b, a # Nice way to swap two variables a, b = 1, 2, 3 pb # => 2 def foo; return 1, 2 end a, b = foo pa # => 1 pb # => 2 

解构/结构化绑定还有其他几件事。 我没有在右侧显示使用图示运算符( * )。 我没有显示嵌套(使用parantheses)。 我没有表明你可以在块或方法的参数列表中使用解构绑定。

这只是一个开胃菜:

 def foo(((a, b, c, d), e, *f), g, *h) local_variables.sort.each do |lvar| puts "#{lvar} => #{eval(lvar).inspect}" end end foo([[1, 2, 3], 4, 5, 6], 7, 8, 9) # a => 1 # b => 2 # c => 3 # d => nil # e => 4 # f => [5, 6] # g => 7 # h => [8, 9] 

虽然返回多个值通常是有用的,我通常会发现这是一个指向新的对象要求。

也就是说,我通常会发现,这些返回值在意义/语境中是紧密地联系在一起的,并且是这样传递的。 所以在这些情况下,我会创build一个新的对象来将它们连接在一起。 这是我学会识别的一种特殊的代码味道。

你也可以实现这个返回数组,就像

 def sumdiff(x, y) [x+y, xy] end 

这在function上似乎相当于

 def sumdiff(x, y) return x+y, xy end