2011-12-09 13 views
12

以下はコンストラクタ付きのScalaクラスです。私の質問には****スカラ補助コンストラクタ

class Constructors(a:Int, b:Int) { 

def this() = 
{ 
    this(4,5) 
    val s : String = "I want to dance after calling constructor" 
    //**** Constructors does not take parameters error? What is this compile error? 
    this(4,5) 

} 

def this(a:Int, b:Int, c:Int) = 
{ 
    //called constructor's definition must precede calling constructor's definition 
    this(5) 
} 

def this(d:Int) 
// **** no equal to works? def this(d:Int) = 
//that means you can have a constructor procedure and not a function 
{ 
    this() 

} 

//A private constructor 
private def this(a:String) = this(1) 

//**** What does this mean? 
private[this] def this(a:Boolean) = this("true") 

//Constructors does not return anything, not even Unit (read void) 
def this(a:Double):Unit = this(10,20,30) 

} 

とマークされていますか?例えば、コンストラクタはパラメータエラーを受けませんか?このコンパイルエラーは何ですか?

答えて

11

答1:this(3)

scala> class Boo(a: Int) { 
    | def this() = { this(3); println("lol"); this(3) } 
    | def apply(n: Int) = { println("apply with " + n) } 
    | } 
defined class Boo 

scala> new Boo() 
lol 
apply with 3 
res0: Boo = [email protected] 

まず、プライマリコンストラクタへの委任です。 2番目のthis(3)はこのオブジェクトのapplyメソッドを呼び出します。つまり、this.apply(3)に展開されます。上記の例を観察してください。

答2:彼らは本当に何も返さないよう

=は、コンストラクタの定義ではオプションです。彼らは、通常の方法とは異なるセマンティクスを持っています。

答3:

private[this]は、オブジェクトプライベートアクセス修飾子と呼ばれています。オブジェクトは両方とも同じクラスに属していても、他のオブジェクトのprivate[this]フィールドにアクセスすることはできません。したがって、privateより厳しいです。以下のエラーを観察:

scala> class Boo(private val a: Int, private[this] val b: Int) { 
    | def foo() { 
    |  println((this.a, this.b)) 
    | } 
    | } 
defined class Boo 

scala> new Boo(2, 3).foo() 
(2,3) 

scala> class Boo(private val a: Int, private[this] val b: Int) { 
    | def foo(that: Boo) { 
    |  println((this.a, this.b)) 
    |  println((that.a, that.b)) 
    | } 
    | } 
<console>:17: error: value b is not a member of Boo 
      println((that.a, that.b)) 
           ^

回答4:

同じ回答として2