2013-09-04 38 views
6

tôi đang chơi xung quanh với các ví dụ mã liên quan đến Scala trong Action cuốn sách http://www.manning.com/raychaudhuri/thông số chức năng có và không có() trong Scala

Trích dẫn từ https://github.com/nraychaudhuri/scalainaction/blob/master/chap01/LoopTill.scala

// Run with >scala LoopTill.scala or 
// run with the REPL in chap01/ via 
// scala> :load LoopTill.scala 

object LoopTillExample extends App { 
    def loopTill(cond: => Boolean)(body: => Unit): Unit = { 
    if (cond) { 
     body 
     loopTill(cond)(body)  
    } 
    } 

    var i = 10 
    loopTill (i > 0) {  
    println(i) 
    i -= 1 
    } 
} 

Trong đoạn code trên cond: => Boolean là nơi tôi bối rối. Khi tôi đổi thành cond:() => Boolean thì không thành công.

Có thể ai đó giải thích cho tôi những gì là sự khác nhau giữa

cond: => Boolean 

cond:() => Boolean 

Không phải cả hai đều đại diện cho params cho chức năng?

+2

Xem http://stackoverflow.com/a/1203799/724361. –

+1

Về cơ bản, chúng giống nhau. Cả hai đều biên dịch thành Function0 [Boolean]. Sự khác biệt duy nhất là call-by-name (cond: => Boolean) ngắn hơn một chút vì bạn không cần phải viết loopTill (() => i> 0) (...) – ZhekaKozlov

Trả lời

7

Tôi không phải là chuyên gia về scala, vì vậy hãy trả lời câu hỏi của tôi với một hạt muối nặng.

Đầu tiên, cond: => Boolean, là thông số theo tên. Để giữ cho mọi thứ đơn giản, nó cơ bản là cú pháp đường cho một hàm của arity 0 - nó là một hàm, nhưng bạn xử lý nó như một biến.

Thứ hai, cond:() => Boolean, là tham số hàm rõ ràng - khi bạn tham chiếu nó mà không thêm tham số, bạn không thực sự gọi hàm, bạn đang tham chiếu. Trong mã của bạn, if(cond) không thể hoạt động: không thể sử dụng hàm làm boolean. Đó là giá trị trả về có thể là, tất nhiên, đó là lý do tại sao bạn cần phải đánh giá một cách rõ ràng nó (if(cond())).

Có vô số tài liệu về thông số tên, một tính năng rất mạnh trong Scala, nhưng theo như tôi hiểu, nó chỉ có thể được coi là cú pháp cú pháp.

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