<< 2008/05/13 | Home | 2008/05/15 >>
PR: 転職    転職サイト    転職    英会話    滋賀    美容室    ニキビ    英会話    転職サイト    化粧品   

Case class

バイトコードを見ると、instanceof使っているんだけど、ということは、複数のcase classが継承関係にある場合、親の方が先のcaseに書かれると、マズイんじゃないだろうか。早速テスト。

abstract class Tree
case class Child extends Tree
case class Child2 extends Child
shanai@shanai-desktop:~/scala$ scalac CaseClass.scala
CaseClass.scala:3 error: implementation restriction: case class Child2 and case class Child cannot be combined in one object
case class Child2 extends Child
     ^
one error found

なるほど、出来ないようになっているわけですか。caseクラス同士は、継承関係にあってはいけないようですな。

末尾再帰

ScalaByExampleで、末尾再帰にしてみろとのことだったので、してみた。

  def factorial2(n: int) : int = {
    factorialIter(1, n)
  }

  def factorialIter(sum: int, n: int) : int = {
    if (n == 1) sum else factorialIter(sum * n, n - 1)
  }

で、バイトコードを見てみる。

public int factorialIter(int, int);
  Code:
   Stack=3, Locals=3, Args_size=3
   0:	iload_2
   1:	iconst_1
   2:	if_icmpeq	16
   5:	iload_1
   6:	iload_2
   7:	imul
   8:	iload_2
   9:	iconst_1
   10:	isub
   11:	istore_2
   12:	istore_1
   13:	goto	0
   16:	iload_1
   17:	ireturn

おぉ、ループになってますな。

P.S. Scala的には、こうかな。

  def factorial2(n: int) : int = {
    def factorialIter(sum: int, n: int) : int = {
      if (n == 1) sum else factorialIter(sum * n, n - 1)
    }
    factorialIter(1, n)
  }
このサイトの掲載内容は私自身の見解であり、必ずしもIBMの立場、戦略、意見を代表するものではありません。
日本アイ・ビー・エム 花井 志生 Since 1997.6.8