2013-04-24 68 views
4

上午陷入了這樣的語法:單位在斯卡拉 - 無法理解

def foreach(f: Tweet => Unit): Unit = { 
    f(elem) 
    left.foreach(f) 
    right.foreach(f) 
    } 

其中Tweet是三個變量的類。這對函數返回Unit意味着什麼?我嘗試了不同的事情,但在這種情況下無法調用函數本身。

請幫忙。謝謝

回答

3

scala中的單元與Java中的void相同,此外,Java將Scala的單元視爲void,反之亦然。所以在java中它可以這樣寫:

void foreach(MethodThatReturnsVoid f) { 
    f.apply(elem) 
    left.foreach(f) 
    right.foreach(f) 
} 

這是一個有點僞代碼(因爲Java不支持第一類函數還),但我希望你有這個想法。

+2

更準確地說,在Scala/Java接口中,Java的'void'與Scala的'Unit'交換或對應。 – 2013-04-24 18:39:08

1

單位的定義在這裏提到: http://www.scala-lang.org/api/current/index.html#scala.Unit

它,因爲它是一個亞型,而不是保留字是不完全相同在Java中無效。此設計更好,因爲void現在被視爲與其他類型一樣的頭等類型。由於您的代碼具有明確定義的所有類型,因此您可以看到Unit可以用另一種類型替換,並且語法仍然正確。或者,Unit始終可以用{}或者推斷替換。在沒有返回值的定義中,這可以寫成如下所示。

def foreach(f: Tweet => Unit) { ... } 
+1

順便說一句,Java有它自己*不是保留字*:['Void'](http://docs.oracle.com/javase/6/docs/api/java/lang/Void.html),但它比關鍵字對應的用法少得多(例如,它可以在泛型Callable中用於指示該調用方法不返回任何內容)並且具有一些其他差異。 – 2013-04-24 18:39:04

3

返回單位表示函數不返回任何內容。換句話說,你在爲它的副作用調用函數,而不是爲它計算的任何東西。

鑑於你的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)