2011-08-05 50 views
62

Tôi mới đến Scala và tôi thực sự thích nó, nhưng đôi khi nó làm tôi ngạc nhiên. Ví dụ:Điều gì => và() => có nghĩa là trong Scala

clickedCallbacks: List[() => Unit]) 

bất cứ ai có thể cho tôi biết những gì =>() => nghĩa trong Scala?

+0

Vui lòng kiểm tra bài đăng trên blog này "[Làm cách nào để tìm thấy ý nghĩa của một số biểu tượng nào?] (Http://docs.scala-lang.org/tutorials/FAQ/finding-symbols.html)" – Sun

Trả lời

95

=> là đường cú pháp để tạo các phiên bản chức năng. Nhớ lại rằng mọi hàm trong scala là một thể hiện của một lớp.

Ví dụ: loại Int => String, tương đương với loại Function1[Int,String] tức là một hàm lấy đối số loại Int và trả về một String.

scala> val f: Function1[Int,String] = myInt => "my int: "+myInt.toString 
    f: (Int) => String = <function1> 

    scala> f(0) 
    res0: String = my int: 0 

    scala> val f2: Int => String = myInt => "my int v2: "+myInt.toString 
    f2: (Int) => String = <function1> 

    scala> f2(1) 
    res1: String = my int v2: 1 

Đây myInt bị ràng buộc với giá trị đối số truyền cho ff2.

() => T là loại hàm không có đối số và trả lại T. Nó tương đương với Function0[T]. () được gọi là danh sách tham số 0 tôi tin.

scala> val f:() => Unit =() => { println("x")} 
f:() => Unit = <function0> 

scala> f() 
x 

scala> val f2: Function0[Unit] =() => println("x2") 
f:() => Unit = <function0> 

scala> f2() 
x2 
5

=> là "mũi tên chức năng". Nó được sử dụng cả trong các chữ ký kiểu hàm cũng như các thuật ngữ hàm ẩn danh. () => Unit là viết tắt của Function0[Unit], là loại chức năng không có đối số và trả về không có gì hữu ích (như void bằng các ngôn ngữ khác).

13

() => Unit có nghĩa là: "Loại hàm mang theo không có tham số và trả về không có gì"

Vì vậy, nếu bạn khai báo một giá trị f là một chức năng mà mất không có tham số và trả về không có gì loại của nó sẽ là:

val f :() => Unit 

Do đây là một val bạn phải gán một giá trị, ví dụ một hàm in Hola mundo

val f :() => Unit =() => println("Hola Mundo") 

Đó đọc: * "f là một hàm mang theo không có tham số và trả về không có gì khởi tạo với mã println("Hola Mundo")

Vì trong Scala bạn có thể sử dụng suy luận kiểu bạn không cần phải khai báo kiểu như vậy sau đây sẽ là tương đương:

val f =() => println("Hola Mundo") 

Để gọi nó, bạn có thể chỉ:

f() 

>"Hola mundo" 

Hoặc, vì các chức năng cũng là các đối tượng bạn có thể gọi apply Phương pháp:

f.apply() 
> "Hola Mundo" 

Đó là lý do trong việc kê khai của bạn, bạn đang nói "Tôi sẽ có một danh sách mà sẽ giữ chức năng không có params và không có kiểu trả về" vì thế Danh sách [() => Đơn vị]

Tôi hy vọng điều này sẽ hữu ích.

73

=> có một vài ý nghĩa trong Scala, tất cả liên quan đến ý nghĩa toán học của nó là hàm ý.

  • Trong một giá trị, nó giới thiệu một chức năng theo nghĩa đen, hoặc lambda. ví dụ. các bit bên trong dấu ngoặc nhọn trong List(1,2,3).map { (x: Int) => x * 2 }

  • Trong một kiểu, với các biểu tượng trên cả hai mặt của mũi tên (ví dụ A => T, (A,B) => T, (A,B,C) => T, vv) đó là đường cho Function<n>[A[,B,...],T], có nghĩa là, một hàm mang theo các thông số của nhập A[,B...] và trả về giá trị loại T.

    • Parens rỗng ở phía bên tay trái (ví dụ () => T) chỉ ra rằng chức năng mất không có thông số (đôi khi cũng được gọi là một "thunk");

    • Parens rỗng ở phía bên tay phải biểu thị rằng nó trả () — giá trị duy nhất của loại Unit, tên cũng có thể được viết () — bối rối chưa? :)

      Một hàm trả về Đơn vị còn được gọi là thủ tục , thường là phương thức được gọi chỉ cho tác dụng phụ của nó.

  • Trong tuyên bố kiểu cho một tham số phương pháp hay chức năng, không có biểu tượng ở phía bên tay trái (ví dụ def f(param: => T)) đó là một "thông số bằng tên", nghĩa là được đánh giá mỗi khi nó được sử dụng trong phần thân của hàm, và không phải trước đó. Thông số "by-value" thông thường được đánh giá trước khi nhập vào hàm/phương thức.

  • Trong mệnh đề case, họ tách mẫu (và bảo vệ tùy chọn) khỏi biểu thức kết quả, ví dụ: case x => y.

+0

Cảm ơn, tôi đang tìm kiếm "tham số theo tên" có nghĩa là, không được đề cập trong bất kỳ câu trả lời nào khác. Nó được sử dụng khi "đánh giá lười biếng" là bắt buộc. – jp48

3

Như câu trả lời đơn giản nhất, bạn có thể thay thế bất cứ thứ gì ở phía bên trái của => với từ "LEFT" và bất cứ thứ gì ở phía bên tay phải với chữ "QUYỀN".

Sau đó, ý nghĩa của "LEFT => QUYỀN" trở thành:

Rẽ trái rồi thực hiện quyền.

Điều này có nghĩa là nếu bạn có dấu "() =>" mà bạn không thể lấy gì (nghĩa là, không có tham số) và sau đó thực hiện bất cứ điều gì ở phía bên tay phải.

Đây là ý nghĩa phổ biến nhất.

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