2017-10-13 7 views
0

SOの次の質問を参照すると、()の代わりにUnitを関数に渡すのはどうですか?私はあなたがこれらの二つのメソッド定義の違いが何であるかを知っていただきたいと思い伝えることができるもの、もう1つは、関数のパラメータに()単位を超える使用する理由からScalaの関数にUnitを渡す目的は何ですか

Functions without arguments, with unit as argument in scala

+1

私は、ちょうど機能もその現在Tuple0すなわち、いくつかのパラメータを持っていなければならないという事実を強調し、あなたを引き受けますあなたは将来的に物事を拡張することができます。オリジナルのデザインアイデアを表現するオプションとしてご利用ください。 – Pavel

+0

質問を編集して、質問する内容を正確に示すコードを含めることはできますか? 「ユニットを関数に渡す」のような英語のフレーズはあいまいであり、コードは明確です。 –

答えて

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"は、実際にはスカラパッケージの抽象クラスです(そのうちの1つの値 "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または「ユニット」

関連する問題