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ì =>
và () =>
nghĩa trong Scala?
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ì =>
và () =>
nghĩa trong Scala?
=>
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 f
và f2
.
() => 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
=>
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).
() => 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.
=>
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
.
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
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.
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