2011-09-06 119 views
2

下面的代碼:有人可以解釋這裏發生了什麼嗎?

scala> def foo(bar: Unit => String) = {bar} 
foo: (bar: (Unit) => String)(Unit) => String 

scala> foo(a => a.toString) 
res0: (Unit) => String = <function1> 

我猜一個類型爲單位的,而不是單位的對象? Unit類隱藏了嗎?

回答

4

UnitAnyVal,像Int。它的唯一成員是文字,寫作()。例如:

scala> def foo(bar: Unit => String) = {bar} 
foo: (bar: Unit => String)Unit => String 

scala> foo(a => a.toString) 
res0: Unit => String = <function1> 

scala> res0(()) 
res1: String =() 
2

在斯卡拉Unit相當於Java的void。您已經定義了一個函數,該函數接受不帶參數的另一個函數並返回String

這相當於def foo(bar: => String);或者def foo(bar:() => String)

在斯卡拉()Unit

+0

我的主要困惑源於我將.toString應用於Unit實例的事實。單元對象是否可以用其他方式實例化? (新單元).toString和Unit()。toString都失敗。 –

+0

你可以得到Unit的實例的唯一方法是「()」。例如,「().toString」行會給你一個Unit實例的toString。 – nonVirtualThunk

+0

@Henry,你傳入'res0'的任何東西都是'()'類型。你想做什麼?因爲給你什麼總是會返回'String =()' –

4

從你的例子工作的快捷方式......

def foo(bar: Unit => String) = {bar} 

這定義了foo方法,它接受一個功能從UnitString作爲其唯一參數,並簡單地返回相同的參數。

foo(a => a.toString) 

a => a.toString定義了一個函數內聯。由於類型推斷器知道在該位置預計功能Unit => String,因此推斷a的類型爲Unit

然後foo的這個調用返回剛纔定義的匿名函數。

我很好奇,你到底想要達到什麼目的?或者你只是在探索Scala的語法?

2

由凱文·懷特給出的答案是完全正確的,但要打破它進一步下降:

第一行聲明瞭一個名爲foo功能。 foo以另一個函數bar作爲參數,該函數本身需要Unit並返回String。一般來說,斯卡拉的Unitvoid在許多其他語言中的含義相同,因此您可以說大部分bar是一個不帶參數並返回String的函數。

foo函數的主體只返回它收到的參數。因此,scala推斷foo返回的函數需要Unit並返回String

第二個命令調用foo,其功能爲a => a.toString作爲其參數。假設a的類型爲Unit。如果Unitvoid完全相似,則不起作用。缺少某些東西時您不能撥打toString。然而,Unit的行爲稍有不同,完全針對這種情況,a將給予Unit的實例。這個實例實際上不能做太多的事情,但它可以調用toString。因此,第二個命令的結果將是一個返回的toString呼籲Unit實例的結果的函數,它是: 「()」

+1

在我的瀏覽器中,我的答案出現在*你的下面。從個人經驗來看,如果引用其他答覆,引用海報的名字是最安全的。 –

+0

感謝您指出,相應調整 – nonVirtualThunk

相關問題