2011-12-09 44 views
12

Sau đây là một lớp Scala với các nhà xây dựng. Câu hỏi của tôi được đánh dấu bằng ****Scala Nhà xây dựng phụ trợ

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) 

} 

Bạn có thể trả lời các câu hỏi của tôi ở phía trên không? Ví dụ Constructors không có lỗi tham số? Lỗi biên dịch này là gì?

Trả lời

11

Ans 1:

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] 

Đầu tiên this(3) là một phái đoàn đến constructor chính. Số this(3) thứ hai gọi phương thức áp dụng của đối tượng này tức là mở rộng thành this.apply(3). Quan sát ví dụ trên.

Ans 2:

= là tùy chọn trong định nghĩa constructor như họ không thực sự trở lại bất cứ điều gì. Họ có ngữ nghĩa khác nhau từ các phương pháp thông thường.

Ans 3:

private[this] được gọi là đối tượng cá nhân sửa đổi lần truy cập. Một đối tượng không thể truy cập các trường private[this] của đối tượng khác mặc dù cả hai đều thuộc cùng một lớp. Do đó nó chặt chẽ hơn private. Quan sát các lỗi dưới đây:

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)) 
           ^

Ans 4:

Tương tự như Ans 2.

Các vấn đề liên quan