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すると戻り値を上書きすることができるらしい。