次のコード:次のエラーでScalaのインライン適用を解除する抽出
object Test {
@inline def unapply(i: Int): Option[String] =
i match {
case 1 => Some("Got 1")
case 2 => Some("Got 2")
case 3 => throw new Exception("Should not test 3")
case _ => None
}
def test(i: Int) = i match {
case Test(k) => k
case 4 => "Another 4"
case _ => ""
}
}
Test.test(3)
結果:エラーはどこから来るのか、それは明らかだと
...
at Test$.unapply(<console>:13)
at Test$.test(<console>:17)
...
注意。しかし、エラーは、メソッドunapply
が私が望むようにインライン化されていないことを示しています。
この未適用メソッドをインライン化するにはどうすればよいですか?これはパフォーマンスの理由だけでなく、コードの再利用のためです。コンパイラは、メソッドをインライン化しようとするが、それはする必要はありませんし、いくつかのケースでは、それができないことを
わかりませんが、メソッドがインライン化されていても、元のスタックトレースを保持できますか? – marstran
パフォーマンス向上のレベルはどれくらいですか? – Pavel
@marstran私は逆アセンブリをチェックし、そのメソッドがインライン化されていないことを確認できます。 JVMでは、インライン関数でデバッグコードを生成することができます。 –