returnとthrowの鎖
概要
Scalaのreturn, throw(の結果)はNothing型(すべての型のサブタイプ)をもつので、
returnで、returnを評価した結果(Nothing型)を返すことができる。
これを利用して、return{return{...などで遊ぶ。
実装
- chain
return{return{...を実現。
最内ブロックでは型をNothingにするために、例外を投げる。
- chain2
throw{throw{...を実現。
throwでThrowableのサブタイプのインスタンスを投げられることを利用。
- thrownull
ちなみにnullも投げられる。throwのところでNullPointerExceptionが出る。
- intreturn
その他の型でもreturn{return...ができる。
package returntest object ReturnReturn { def main(args : Array[String]) : Unit = { println(intreturn()) println(intreturn2()) println(intreturn3()) } //return chain def chain() : Nothing = return {return {return {throw new Throwable}}} //throw chain def chain2() : Nothing = throw {throw {throw new Throwable}} //throw null def thrownull() : Nothing = throw null //return chain(int) def intreturn() : Int = return {return {return 1}} //assignment and pattern matching def intreturn2() : Int = { //assignment val a = return 1 val b = throw new Throwable //assignment into String val c : String = return 1 val d : String = throw new Throwable //pattern matching val e = (return 1) match { case x => println(x) } val f = (throw new Throwable) match { case x => println(x) } 100 } //duplicate return def intreturn3() : Int = { try { return 1 } finally { return 2 } } }
その他メモ
- その他、returnの結果を代入やパターンマッチもできる。意味はない。
- tryでreturnし、finally節でもreturnすると戻り値を上書きすることができるらしい。