2012-01-10 32 views
7

Tôi đang trải qua một Lift cuốn sách trong hành động và tôi gặp phải cái gì tôi không hiểu lắm: _ ::_: có nghĩa là gì trong Scala?

object permanent_link extends MappedString(this, 150){ 
    override def validations = 
    valMinLen(3, "Link URL must be at least 5 characters") _ :: 
    super.validations 
} 

tôi không thể tìm thấy bất kỳ gợi ý vì vậy tôi sẽ biết ơn nếu có ai có thể giúp tôi ra ngoài ..

Trả lời

18

Tôi không biết Lift, nhưng đây là một câu hỏi chung. Trước hết, các :: là một khuyết điểm điều hành Scala:

scala> 1 :: 2 :: List(3, 4) 
res0: List[Int] = List(1, 2, 3, 4) 

Điều này có nghĩa rằng super.validations là một số loại một chuỗi và valMinLen(3, "Link URL must be at least 5 characters") _ là một giá trị duy nhất trong danh sách đó.

Từ ngữ cảnh có vẻ hiển nhiên là phương pháp validations bị ghi đè mà họ đang gọi super phiên bản sẽ thêm một số xác thực bổ sung ngay từ đầu.

Xác thực bổ sung này được tạo bằng cách gọi tới valMinLen(). Tuy nhiên, cuộc gọi bổ sung này không trả về một phần tử phù hợp với loại danh sách validations - nhưng là một hàm. Thay vì việc thêm trước giá trị hàm, chúng ta đang nói rõ ràng (bằng cách thêm _ hậu tố`) mà chúng ta muốn thêm vào một hàm, chứ không phải một giá trị trả về của hàm đó.

đoạn Mã trị giá một ngàn chữ:

scala> def f = 3 
f: Int 

scala> def g = 4 
g: Int 

scala> val listOfInts = List(f, g) 
listOfInts: List[Int] = List(3, 4) 

scala> val listOfFunctions = List(f _, g _) 
listOfFunctions: List[() => Int] = List(<function0>, <function0>) 

Hãy so sánh các loại listOfIntslistOfFunctions. Tôi tin rằng cú pháp f _ được gọi là chức năng được áp dụng một phần trong thế giới Scala.

5

Dấu gạch dưới kích hoạt rằng valMinLen không được gọi nhưng được sử dụng làm hàm "con trỏ".

Nhà điều hành :: nối các danh sách.

Nó sẽ nói cách khác có vẻ như mã xây dựng một danh sách validations đó bao gồm một chức năng "con trỏ" để valMinLen với các thông số nhất định và phần còn lại của danh sách là giá trị của super.validations, đó là siêu lớp kiểm chứng thực .

tôi chắc chắn rằng ai đó sẽ sửa thuật ngữ của tôi ở đây :)

0

Mã này có thể dễ đọc hơn với một số thụt đầu dòng phù hợp và giới thiệu một val:

object permanent_link extends MappedString(this, 150) { 

    override def validations = minimumValidation :: super.validations 

    val minimumValidation = valMinLen(3,"Link URL must be at least 5 characters") _ 
} 

Vì vậy, như đã nói trước đây, các nhà điều hành :: chỉ cần thêm một phần tử mới vào danh sách, _ không liên quan gì đến nó và được sử dụng để lấy đối tượng hàm, như trong

(1 :: 2 :: Nil) map (println _) 

tạo danh sách [1, 2] và áp dụng hàm println cho mọi phần tử (dấu gạch dưới thực sự có thể bị bỏ qua ở đây). Đối tượng println _ xây dựng đối tượng hàm từ phương thức println với _ biểu thị tham số đơn của hàm.

+0

Vì vậy, bạn có thể tham chiếu 'minimumValidation' trước khi bạn khai báo? – ziggystar

+0

Thứ tự tuyên bố không quan trọng trong scala, nó không có trong hầu hết các ngôn ngữ hiện tại. – Ramses