メソッドの戻り値って複数可能?

コードリーディングを始めよう − @IT
を参考に、skipのコードを眺めてたら


メソッドの戻り値が複数あるやん。
へぇ〜、こんなんできるんか。

確認してみた

irb(main):027:0* def ret2
irb(main):028:1>   return "r1","r2"
irb(main):029:1> end
=> nil
irb(main):030:0> 
irb(main):031:0* a = ret2
=> ["r1", "r2"]
irb(main):032:0> a.class
=> Array
irb(main):033:0> 
irb(main):034:0* x,y = ret2
=> ["r1", "r2"]
irb(main):035:0> x.class
=> String
irb(main):036:0> y.class
=> String

irb(main):037:0> x
=> "r1"
irb(main):038:0> y
=> "r2"


なるほど、通常は配列で返ってくるのを
個別にセットできるのかぁ。
これは何かいいな。使えそう。

ちなみに

受け側が配列の要素数より多い場合は
nilとなる。エラーにしない。

irb(main):037:0> x,y,z = ret2
=> ["r1", "r2"]
irb(main):038:0> x.class
=> String
irb(main):039:0> y.class
=> String
irb(main):040:0> z.class
=> NilClass

irb(main):041:0> x
=> "r1"
irb(main):042:0> y
=> "r2"
irb(main):043:0> z
=> nil

おまけに

受け側より要素数が多い場合もエラーにしない。

irb(main):044:0> def ret3
irb(main):045:1>   return "r1","r2","r3"
irb(main):046:1> end
=> nil
irb(main):047:0> x,y = ret3
=> ["r1", "r2", "r3"]
irb(main):048:0> x.class
=> String
irb(main):049:0> y.class
=> String

irb(main):050:0> x
=> "r1"
irb(main):051:0> y
=> "r2"

コードリーディングについて

人の書いたソースは、読みたいんだけど
量が多いとどっから読めばいいか躊躇してしまう。


こういう解説があると敷居を下げて、間口を広げてくれる感じがして
読みやすかった。