2017-10-13 67 views
0

參考SO中的以下問題,將Unit傳遞給函數而不是()(反之亦然)的用處是什麼?將`Unit`傳遞給Scala中的函數的目的是什麼

Functions without arguments, with unit as argument in scala

+1

我會假設你只是強調一個事實,即函數必須有一些參數,甚至其目前Tuple0即所以你可以在將來擴展事物。把它作爲一個選項來表達你的原創設計理念。 – Pavel

+0

你可以編輯你的問題,包括一些代碼,準確地顯示你的意思嗎?一個英文短語如「將'Unit'傳遞給函數」是不明確的,代碼是確定的。 –

回答

1

從我可以告訴你想知道的是什麼這兩個方法定義之間的差異,以及爲什麼會使用單位超過()函數中的參數。

def func1(f:Unit=>String) = { 
    println(f) 
} 

def func2(f:()=>String) = { 
    println(f) 
} 

的差異可以通過查看該代碼的輸出予以強調:

func1(Unit => "hello") 
func2(() => "hello") 

你可能會驚訝地看到這樣的輸出:

<function1> 
<function0> 

單位=>字符串實際上是一個參數爲1的函數。 While()=> String是一個帶有0個參數的函數。

在Scala中()可能意味着兩件事

  • 它可用於例如單位val x:Unit =()
  • 它可以用來表示沒有參數。

在func2中,它是一個沒有參數的函數。

func1中的「Unit」實際上是scala包(其中只有一個值「Unit」或「()」)的抽象類。因此,當定義函數Unit => String時,我們定義的是一個函數,它將Unit類型的參數作爲參數,並返回一個值。不是不帶參數的功能。

最後的調整的代碼以突出的區別:

def func1(f:Unit=>String) = { 
    println(f(Unit)) 
} 

def func2(f:()=>String) = { 
    println(f()) 
    //println(f(Unit)) - does not compile 
} 


func1(Unit => "hello") 
func2(() => "hello") 

將輸出你好兩次。

我建議FUNC2或()通常是人們想要什麼,而不是FUNC1或「單位」

相關問題