上午陷入了這樣的語法:單位在斯卡拉 - 無法理解
def foreach(f: Tweet => Unit): Unit = {
f(elem)
left.foreach(f)
right.foreach(f)
}
其中Tweet
是三個變量的類。這對函數返回Unit
意味着什麼?我嘗試了不同的事情,但在這種情況下無法調用函數本身。
請幫忙。謝謝
上午陷入了這樣的語法:單位在斯卡拉 - 無法理解
def foreach(f: Tweet => Unit): Unit = {
f(elem)
left.foreach(f)
right.foreach(f)
}
其中Tweet
是三個變量的類。這對函數返回Unit
意味着什麼?我嘗試了不同的事情,但在這種情況下無法調用函數本身。
請幫忙。謝謝
scala中的單元與Java中的void相同,此外,Java將Scala的單元視爲void,反之亦然。所以在java中它可以這樣寫:
void foreach(MethodThatReturnsVoid f) {
f.apply(elem)
left.foreach(f)
right.foreach(f)
}
這是一個有點僞代碼(因爲Java不支持第一類函數還),但我希望你有這個想法。
單位的定義在這裏提到: http://www.scala-lang.org/api/current/index.html#scala.Unit
它,因爲它是一個亞型,而不是保留字是不完全相同在Java中無效。此設計更好,因爲void
現在被視爲與其他類型一樣的頭等類型。由於您的代碼具有明確定義的所有類型,因此您可以看到Unit可以用另一種類型替換,並且語法仍然正確。或者,Unit始終可以用{}或者推斷替換。在沒有返回值的定義中,這可以寫成如下所示。
def foreach(f: Tweet => Unit) { ... }
順便說一句,Java有它自己*不是保留字*:['Void'](http://docs.oracle.com/javase/6/docs/api/java/lang/Void.html),但它比關鍵字對應的用法少得多(例如,它可以在泛型Callable中用於指示該調用方法不返回任何內容)並且具有一些其他差異。 – 2013-04-24 18:39:04
返回單位表示函數不返回任何內容。換句話說,你在爲它的副作用調用函數,而不是爲它計算的任何東西。
鑑於你的foreach例子,下面是一些可能有意義的函數。
// A Tweet class with 3 values (shorter declaration than vars).
case class Tweet(a: Int, b: String, c: String)
// Print out the contents of a Tweet.
def tweetFunc(t: Tweet): Unit = {
println("I am a Tweet. %d %s %s".format(t.a, t.b, t.c))
}
// The data that is used by the foreach function.
val elem = Tweet(1, "Hello", "World")
val left = List(elem, Tweet(2, "a", "b"))
val right = List(Tweet(3, "c", "d"))
// Original foreach function.
def foreach(f: Tweet => Unit): Unit = {
f(elem)
left.foreach(f)
right.foreach(f)
}
// Call the foreach function with tweetFunc as the parameter.
foreach(tweetFunc _)
///// OUTPUT /////
I am a Tweet. 1 Hello World // from f(elem)
I am a Tweet. 1 Hello World // from left.foreach(f)
I am a Tweet. 2 a b // from left.foreach(f)
I am a Tweet. 3 c d // from right.foreach(f)
更準確地說,在Scala/Java接口中,Java的'void'與Scala的'Unit'交換或對應。 – 2013-04-24 18:39:08