2010-07-28 41 views
10

Mã này làm gì? Tại sao có hai bộ tham số constructor?Hai bộ tham số hàm tạo trong một lớp scala

class A(val x: Int)(val y: Int) 

tôi có thể khởi tạo một đối tượng và sử dụng cả hai lĩnh vực:

val a = new A(5)(7) 
println(a.x + ", " + a.y) 

Nếu tôi làm cho nó một lớp trường hợp, tôi có thể phù hợp với chỉ bởi tập đầu tiên của các tham số.

case class A(x: Int)(y: Int) 
val a = A(5)(7) 
a match { 
    A(x) => println(x) 
} 

Không thể tạo 3 bộ tham số. Nó không biên dịch. Vì vậy, ý nghĩa của hai bộ tham số constructor là gì?

+1

Nó không phải là thứ tôi tạo ra. Tôi tìm thấy cấu trúc này trong thư viện scala swing: https://lampsvn.epfl.ch/trac/scala/browser/scala/trunk/src/swing/scala/swing/event/MouseEvent.scala – PeWu

Trả lời

7

Theo số scala specification (xem phần 5.3), tập hợp tham số thứ hai được dành riêng cho tham số ngầm. Việc chia các tham số thành hai bộ cho phép bạn xác định chỉ có tham số không ngầm và để cho tham số khác được định nghĩa theo ngữ cảnh.

Thật lạ là trình biên dịch tuân thủ các tham số không ngầm trong tập thứ hai.

+2

Cảm ơn bạn. Nếu tôi thêm từ khóa _implicit_ vào tập thứ hai, nó bắt đầu ẩn, nhưng nó không ngầm ẩn chứa mà không có từ khóa _implicit_. Dù sao, đặc tả scala không cho phép các tham số không ngầm trong tập thứ hai. – PeWu

+0

Vâng ... phần này của spec có vẻ rất lạ: ví dụ được đưa ra ngay bên dưới ngữ pháp dường như không tương ứng với ngữ pháp. Và "class Test (a: Int) (b: Int) (c: Int)" là một định nghĩa lớp hợp lệ. – Nicolas

+1

@PeWu +1 để có cụm từ "nó không ngầm ẩn chứa mà không có từ khóa ẩn" :) – I82Much

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