Scala は、1 つだけでなく、任意の数のパラメーター ブロックを持つことができます。そう:
def f(i: Int) = i + 2
def g(i: Int)(j: Int) = i + j
def h(i: Int)(j: Int)(b: Boolean) = if (b) i + j else i * j
すべての作品。defパラメーター ブロックは、パラメーターを整理し、メソッド ( ) から関数 (引数として渡すことができるメソッド) への変換を処理する方法をコンパイラに通知する方法です。
ここで、空のパラメーター ブロックがある場合は、簡潔にするために省略できます。
def a()()() = println("Hi") // Do nothing!
a()()() // Full call
a() // Drop some
a // Drop all of them
a同じことを行うためのすべての呼び出し。ただし、属するよりも多くの空のパラメーター ブロックを追加することはできません。これらは、メソッドによって返されるものへの呼び出しとして解釈されます。
a()()()() // No go, calls `()` on `Unit` which doesn't exist
したがって、これはあなたのケース1と3をカバーしています。
これで、メソッドが関数を返すようにすることもできます。関数は引数 (1 つのブロックのみ!) を出力にマップしますが、メソッドとは異なり、渡すことができます。(Scala は、必要なときにメソッドを関数に自動的にラップするのが得意です。)
そう
def b = () => println("Hi")
を呼び出すたびにb、パラメータをとらず、戻り値を返す関数を作成する必要があると述べていprintln("Hi")ます。実際、これは を返しますUnit。つまり、戻り値はありません。実際には値ですが、常に同じエンティティです: ()。voidこれにより、戻り値を持つプロシージャ/メソッドとメソッドの特別なケースを用意する必要がなくなります。すべてに戻り値があります (少なくとも概念的には)。とにかく、あなたが持っているなら:
val c = b
次に、それを呼び出すことができます:
c() // Will print "Hi"
または、すべてを一度に作成して呼び出すこともできます
b() // The `b` part creates the function, `()` calls it.
たとえば、Scala でのプログラミングのツアーでは、この点に関して必要なすべての基本をカバーします。(お金を払わなければならない場合でも、紙のコピーを持っているのが好きでした。)