2012-02-16 32 views
6

Tôi muốn giải thích về sự khác biệt ví dụ giữa tuyên bố này:Tuyên bố hàm tạo lớp ... Hai cách khai báo cùng một thứ?

class Clazz(param1: String, param2: Integer) 

và một này:

class Clazz(param1: String)(param2: Integer) 

Liệu tuyên bố thứ hai ảnh hưởng đến chỉ cách instantiating các đối tượng hoặc là có bất kỳ lý do sâu xa hơn Tôi không biết.

Một lý do tôi nghĩ về sẽ có nhiều độ dài thay đổi các thông số ví dụ:

class Clazz(param1: String*)(param2: Integer*) 

Vì vậy, là có bất kỳ những người khác?

Trả lời

11

# 1 Loại suy luận. Nó đi từ trái sang phải và được thực hiện cho mỗi danh sách tham số.

scala> class Foo[A](x: A, y: A => Unit) 
defined class Foo 

scala> new Foo(2, x => println(x)) 
<console>:24: error: missing parameter type 
       new Foo(2, x => println(x)) 
         ^

scala> class Foo[A](x: A)(y: A => Unit) 
defined class Foo 

scala> new Foo(2)(x => println(x)) 
res22: Foo[Int] = [email protected] 

# 2 danh sách tham số ngầm.

scala> class Foo[A](x: A)(implicit ord: scala.Ordering[A]) { 
    | def compare(y: A) = ord.compare(x, y) 
    | } 
defined class Foo 

scala> new Foo(3) 
res23: Foo[Int] = [email protected] 

scala> res23 compare 7 
res24: Int = -1 

scala> new Foo(new {}) 
<console>:24: error: No implicit Ordering defined for java.lang.Object. 
       new Foo(new {}) 
      ^
3

Trong phiên bản thứ hai, bạn khai báo một hàm tạo chính đã được curried cho Clazz. Vì vậy, sự khác biệt giữa hai phiên bản là giống như sự khác biệt giữa "bình thường" và chức năng cà ri tại Scala, tức là

def foo(param1: String, param2: Int) 

def foo(param1: String)(param2: Int) 

Hầu hết thời gian cả hai tờ khai có thể được sử dụng thay thế cho nhau nhưng nếu bạn thường cần phải cà ri chức năng sau đó nó làm cho tinh thần hơn để khai báo nó ở dạng đã khóc. Lưu ý: Bạn cũng có thể chuyển đổi một chức năng bình thường hoặc thậm chí xây dựng thành một dạng cà ri, cho ví dụ bạn có thể chuyển đổi constructor Clazz bình thường của bạn vào mẫu cà ri sử dụng này:

(new Clazz(_, _)).curried 

Bạn cũng cần nhiều danh sách tham số nếu bạn đang đi qua một tiềm ẩn giá trị (vì từ khóa ngầm định áp dụng cho danh sách tham số đầy đủ)

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