Ruby 一个函数返回多个值

camel · 2012年03月14日 · 最后由 Juanito 回复于 2013年07月09日 · 13118 次阅读

ruby 的x, y = "a", "b"语法真的很帅,有时一个函数需要返回多个值,两个结合可以写出很帅的代码。

如需要定义一个方法同时返回最大值 max 和最小值 min:

class MyClass
 def some_method
   ["max", "min"]
 end
end

调用方法:

max, min = MyClass.new.some_method

不就是返回数组吗

这种情况,我宁愿返回一个 Hash。

这中语法还是交换变量的时候最爽

x = 1
y = 2
x, y = y, x 

很多语言都支持, 比如 python 和 lua. php 其实也支持,不过要加个 list,比较 ugly

为了一个 method 只干一件事,还是拆成两个 method 比较好

#1 楼 @hooopo 实际上就是数组,技术含量虽然不高,但感觉看上去很直观。 #2 楼 @lgn21st 返回 hash 也行啊。

def some_method
   {:max => 100, :min => 1}
 end


只是调用时取值要写 key,比数组麻烦一点:

max, min = MyClass.new.some_method[:max], MyClass.new.some_method[:min]


#6 楼 @camel 其实我一直在想的是有没有一个典型的 user case,这个 case 在任何情况下调用的结果都必须返回两个对象?

这个语法糖的关键是在赋值的时候,而不是在返回的时候。这个返回就是个数组而已...

#7 楼 @lgn21st 我觉得没有"必须"的情况... 因为他必然可以拆分成两个...

#6 楼 @camel 这个有点像模式匹配呀 虽然没有 erlang 那么强大。

http://rubyeye.herokuapp.com/articles/13-pattern-match-in-ruby

#9 楼 @hooopo 很棒的 idea~ ! 如果没记错的话,Ruby 并没有实现尾递归优化, 即使我们写出了尾递归的代码,如果递归层次太深,依然会报 SystemStackError :)

有办法返回值不要塞在数组里吗?一般返回 $ foo => [1, 2] 可以像这样返回么?

$ foo
1
2

查了下应该是不行,得放入变量才行,不过看到一个很有趣的代码:

https://gist.github.com/peterhellberg/2081118

需要 登录 后方可回复, 如果你还没有账号请 注册新账号