2012-10-10 56 views
2

我只是學習類和對象和Scala,昨天我看到了這樣的事情:爲什麼我能夠使用傳遞給類定義的參數?

class Foo(bar: Int) { 
    def increaseByOne = bar + 1 
} 

爲什麼我只能在方法increaseByOne使用bar?我希望方法定義抱怨不知道bar

我雖然以限定這樣的類以正確的方式將是

class Foo(x: Int) { 
    val bar = x 

    def increaseByOne = bar + 1 
} 

回答

7

這就是斯卡拉的精彩功能之一:如果從不是構造函數的任何方法引用構造函數的參數,斯卡拉會自動將該構造函數變量分配給一個字段。因此,有效的Scala會將您的第一個代碼片段轉換爲第二個代碼片段(使用private[this]修飾符)。

此外,構造參數前述與val/var將創建getter/setter方法,以及:

class Foo(val bar: Int) 
val foo = new Foo(42); 
println(foo.bar) 
+0

+1爲了解釋什麼把VAL /變種中的參數的前面。相當不錯的功能:-)。 – helpermethod

2

在這種情況下bar被定義爲private[this]並且可以在類定義內acessed。你可以用-Xprint:typer選項檢查:

class Foo extends java.lang.Object with ScalaObject { 
    <paramaccessor> private[this] val bar: Int = _; 
    def this(bar: Int): $line1.$read.$iw.$iw.Foo = { 
    Foo.super.this(); 
    () 
    } 
} 
相關問題