2016-11-29 1 views
3

次のコード:次のエラーで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が私が望むようにインライン化されていないことを示しています。
この未適用メソッドをインライン化するにはどうすればよいですか?これはパフォーマンスの理由だけでなく、コードの再利用のためです。コンパイラは、メソッドをインライン化しようとするが、それはする必要はありませんし、いくつかのケースでは、それができないことを

+0

わかりませんが、メソッドがインライン化されていても、元のスタックトレースを保持できますか? – marstran

+0

パフォーマンス向上のレベルはどれくらいですか? – Pavel

+1

@marstran私は逆アセンブリをチェックし、そのメソッドがインライン化されていないことを確認できます。 JVMでは、インライン関数でデバッグコードを生成することができます。 –

答えて

3

@inlineのみ要求。コンパイラがインライン化できるかどうかについての仕様があるとは思えませんが(コンパイラがあればそれを見たいと思っていますが)、コンパイラは単純にこの場合はないでしょうあなたがしていることに関係します。

一般的には、一定であるか小さくて、変更される可能性が低いものだけをインライン化したいと思うでしょう。それ以外の場合は、Test.unapplyを多く使用すると、コンパイルされたコードのサイズがすばやく増加し、インラインメソッドへの変更がそのコードを参照するすべてのものに広がります。

This answer @RexKerrから十分です。

関連する問題