2014-03-26 127 views
31

從科特林文檔的目的:是什麼單位,返回函數

如果一個函數不返回任何有用的價值,它的返回類型爲單位。單位是隻有一個值的類型 - 單位。價值。該值不必顯式返回:

fun printHello(name : String?) : Unit { 
    if (name != null) 
    print("Hello, $name!") 
    else 
    print("Hi there!") 
    // We don't need to write 'return Unit.VALUE' or 'return', although we could 
} 

單元返回函數的目的是什麼? VALUE爲什麼在那裏?這是什麼VALUE?

+7

我不是類別理論專家,但AFAIK名稱'void'和'unit'來自類別理論。 'void'是一個沒有成員的類,'unit'是有一個成員的類,'bool'是有兩個成員的類(true&false)。 void從C繼承而來,這是泛型代碼的一大麻煩。通常在Java,C#和C++中,您需要專門處理'void'情況,因爲它是一種奇怪的類型(它沒有任何價值)。 「單位」是微妙優越的,因爲它有一個值,這意味着不需要特殊情況。同樣在FP中,所有函數都需要1個參數,所以你需要一個不關心的值。 – FuleSnabel

回答

69

其目的與C或Java的void相同。唯一的單位是合適的類型,因此它可以作爲一種通用的參數等傳遞

  1. 爲什麼我們不把它稱爲「空白」:因爲「作廢」的意思是「無中生有」,並有另一類型,Nothing,這意味着只是「沒有價值」,即計算沒有正常完成(永遠循環或拋出異常)。我們無法承受意義上的衝突。

  2. 爲什麼Unit有一個值(即與Nothing不相同):因爲通用代碼可以順利工作。如果傳遞Unit作爲泛型參數T,則爲任何T寫的代碼都會期望一個對象,並且必須有一個對象,即Unit的唯一值。

  3. 如何訪問單位的該值:因爲它是一個單獨的對象,只是說Unit

+1

謝謝!我看到它現在不是虛無或沒有的原因。但選擇'單位'對我來說看起來有點誤導。雖然我不是英語母語的人。 – MajesticRa

+13

「單位」只代表「只有一個價值的東西」,它是一個傳統的名字,來自功能語言。我同意這個名字不太直觀,但我們沒有發明一個更好的名字。 –

+2

'Unit.VALUE'似乎不再存在,我想你只是使用'Unit'。 –

7

的主要原因單位存在是因爲通用的原因。 讓我們使用Kotlin文檔中的示例。

class Box<T>(t: T) { 
    var value = t 
} 

我們可以有

var box = Box(Unit) 

這就是爲什麼單位返回一個值,因此科特林可以傳遞到類初始化的類型來推斷。當然,你也可以這樣寫出來,

var box = Box<Unit>(Unit) 

但都一樣,它必須有一個返回值。 現在,無效關鍵字在Java中的科特林是沒有Nothing是Kotlin中類型層次結構中的最後一種,最後一種是什麼都沒有?(無空)。這根本不會返回任何值。因爲它根本不返回任何值,所以我們無法將它作爲上述代碼中的類型傳遞。

var box = Box(Nothing) //This will return an Error