2016-12-14 16 views
1

私は、これはあなたが引数なしの関数を得るようアンダースコアはデフ

def x() = 1 
x _ //() => Int 
x() _ // error: _ must follow method; cannot follow Int 

x _は、関数にメソッドをオンなぜ起こるか私は理解して考えるようヴァルを扱います。 x() _は意味を持ちません。メソッドを呼び出すとIntになり、関数に変換することはできません。しかし、なぜこれが起こるのでしょうか?

val x = 1 
x _ //() => Int 

答えて

3

パラメータのないメソッドは、それが呼ばれるまで値を計算しない(と追加の各呼び出しの値を再計算します)ことを除いてvalとパラメータのない方法、ほとんど違いがあります。下のvalに実際に起こることは、その値を返すパブリックアクセサメソッドとともに宣言されたプライベートフィールドがあることです。

object Test { 
    def method = 1 
    val value = 1 
} 

にコンパイル:これはあなたが、例えば、サブにvalでスーパークラスでdefを上書きすることができます

<stable> <accessor> def value(): Int = Test.this.value; 

object Test extends Object { 
    def method(): Int = 1; 
    private[this] val value: Int = _; 
    <stable> <accessor> def value(): Int = Test.this.value; 
    def <init>(): Test.type = { 
    Test.super.<init>(); 
    Test.this.value = 1; 
    () 
    } 
} 

注ラインをそれはであり、実際にはのメソッドをオーバーライドしています。メソッドが実際に生成されるので、valを関数にエタ拡張することができます。

+0

*パラメータなしメソッドは、呼び出されるまで値を計算しない点を除いて、valとパラメータなしメソッドの間に少しの違いがあります。*また、パラメータなしメソッドは呼び出されるたびに結果を計算します。 – Jubobs

関連する問題