2

Scalaを拾うだけです。オンラインの多くのチュートリアルにもかかわらず、言語の基礎を理解するのは驚くほど難しいことがわかりました。誰かが次のコードのニュアンスを説明できますか? (scala 2.10.2 を使用)

ケース1

scala> def greet = println("helloo")
greet: Unit
scala> greet
helloo
scala> greet()
<console>:9: error: Unit does not take parameters
          greet()
               ^

ケース 2

scala> def greet = ()=>println("helloo")
greet: () => Unit
scala> greet
res31: () => Unit = <function0>
scala> greet()
helloo

ケース 3

scala> def greet() = println("helloo")
greet: ()Unit
scala> greet
helloo
scala> greet()
helloo

しかし、Scala 言語の明確な概念的な説明がないのは驚くべきことです。まったくの初心者の質問でしたら申し訳ありません。

4

1 に答える 1

8

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 でのプログラミングのツアーでは、この点に関して必要なすべての基本をカバーします。(お金を払わなければならない場合でも、紙のコピーを持っているのが好きでした。)

于 2013-08-01T20:37:28.077 に答える