下面的代碼:有人可以解釋這裏發生了什麼嗎?
scala> def foo(bar: Unit => String) = {bar}
foo: (bar: (Unit) => String)(Unit) => String
scala> foo(a => a.toString)
res0: (Unit) => String = <function1>
我猜一個類型爲單位的,而不是單位的對象? Unit類隱藏了嗎?
下面的代碼:有人可以解釋這裏發生了什麼嗎?
scala> def foo(bar: Unit => String) = {bar}
foo: (bar: (Unit) => String)(Unit) => String
scala> foo(a => a.toString)
res0: (Unit) => String = <function1>
我猜一個類型爲單位的,而不是單位的對象? Unit類隱藏了嗎?
Unit
是AnyVal
,像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 =()
在斯卡拉Unit
相當於Java的void
。您已經定義了一個函數,該函數接受不帶參數的另一個函數並返回String
。
這相當於def foo(bar: => String);
或者def foo(bar:() => String)
在斯卡拉()
是Unit
從你的例子工作的快捷方式......
def foo(bar: Unit => String) = {bar}
這定義了foo
方法,它接受一個功能從Unit
到String
作爲其唯一參數,並簡單地返回相同的參數。
foo(a => a.toString)
a => a.toString
定義了一個函數內聯。由於類型推斷器知道在該位置預計功能Unit => String
,因此推斷a
的類型爲Unit
。
然後foo
的這個調用返回剛纔定義的匿名函數。
我很好奇,你到底想要達到什麼目的?或者你只是在探索Scala的語法?
由凱文·懷特給出的答案是完全正確的,但要打破它進一步下降:
第一行聲明瞭一個名爲foo
功能。 foo
以另一個函數bar
作爲參數,該函數本身需要Unit
並返回String
。一般來說,斯卡拉的Unit
與void
在許多其他語言中的含義相同,因此您可以說大部分bar
是一個不帶參數並返回String
的函數。
foo
函數的主體只返回它收到的參數。因此,scala推斷foo
返回的函數需要Unit
並返回String
。
第二個命令調用foo
,其功能爲a => a.toString
作爲其參數。假設a
的類型爲Unit
。如果Unit
與void
完全相似,則不起作用。缺少某些東西時您不能撥打toString
。然而,Unit
的行爲稍有不同,完全針對這種情況,a
將給予Unit
的實例。這個實例實際上不能做太多的事情,但它可以調用toString
。因此,第二個命令的結果將是一個返回的toString
呼籲Unit
實例的結果的函數,它是: 「()」
在我的瀏覽器中,我的答案出現在*你的下面。從個人經驗來看,如果引用其他答覆,引用海報的名字是最安全的。 –
感謝您指出,相應調整 – nonVirtualThunk
我的主要困惑源於我將.toString應用於Unit實例的事實。單元對象是否可以用其他方式實例化? (新單元).toString和Unit()。toString都失敗。 –
你可以得到Unit的實例的唯一方法是「()」。例如,「().toString」行會給你一個Unit實例的toString。 – nonVirtualThunk
@Henry,你傳入'res0'的任何東西都是'()'類型。你想做什麼?因爲給你什麼總是會返回'String =()' –