2011-12-28 23 views
14

Tôi cố gắng để đọc các tham số-list của 2 chức năng sau:Làm thế nào để đọc một chuỗi các chức năng Scala thông số

1. def foo(action: => String => String) = "bar" 
2. def foo(action: =>() => String => String) = "bar" 
  1. Một hàm có tên "foo" mà nhận được một hàm có tên "hành động" nhận/trả về ???
  2. Một hàm có tên "foo" nhận hàm có tên "hành động" trả về hàm trả về ???
+0

Vấn đề của tôi trong sự hiểu biết là tôi không biết làm thế nào để quyết định xem một trong những là đối phó với các chức năng hoặc giá trị đơn giản như các tham số ở đây. – recalcitrant

Trả lời

13
  1. action là một chức năng thông qua-by-tên mà phải mất một String và trả về một String.
  2. action là một chức năng thông qua-by-tên mà có gì để trả về một hàm mà phải mất một String và trả về một String

Bây giờ bạn có thể hỏi, "Vâng, những gì nó có nghĩa là cho một tham số để được đã từng tên? " Được rồi ... đó là một loại giun hoàn toàn khác nhau. Về cơ bản, thông số tên được truyền chỉ được đánh giá khi nó được sử dụng trong hàm và mỗi lần thời gian được sử dụng trong hàm này. Điều này cho phép là một cái gì đó giống như chập mạch, như sau

def orOperator(left: Boolean, right: => Boolean) : Boolean = if (left) true else right 

Trong trường hợp này, các nhà điều hành sẽ ngắn mạch (và chấm dứt mà không tính toán/đánh giá right) nếu nó tìm thấy left đến mức khó tin.

Vì vậy, ... những gì bạn có với các thông số này là một cái gì đó tương tự. Chúng là các hàm không đánh giá — vì một số lý do - trừ khi/cho đến khi chúng được đặt tên trong phần thân hàm. Tôi không hiểu động lực cho điều đó, nhưng ... đó là cách nó. Tôi hy vọng rằng sẽ giúp.

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