2

私はscalaの初心者です。

違いは何ですか

 invokeFunc(() => { "this is a string" } )

 invokeFunc({ () => "this is a string" })

小さなスケールのニュアンスに関する優れたリソースがあれば、それをいただければ幸いです。

4

2 に答える 2

10

TL; DR:これら2つのコードスニペットは同等です。

() => { "this is a string" }括弧内にコードのブロックを導入します。このコードブロックには式が1つしかないため、本質的に役に立たず、を記述しただけで済みます() => "this is a string"

また、scalaでは、ほとんどの場合、メソッドを呼び出すときに括弧を使用するか中括弧を使用するかを選択できます。だからprintln("hello")と同じprintln{"hello"}です。Scalaが中括弧を許可する理由は、言語の組み込み部分であるかのように使用できるメソッドを定義できるようにするためです。例として、以下を定義できます。

def fromOneToTen( f: Int => Unit ) { 
  for ( i <- 1 to 10 ) f(i) 
}

そして、次のことを行います。

fromOneToTen{ i => println(i) }

ここでの中括弧は、scalaの組み込みなどの制御構造のように見えますwhile

だからinvokeFunc(() => { "this is a string" } )と同じですinvokeFunc{() => { "this is a string" } }

最後のポイントとして、括弧は常に単一の式の周りのどこでも使用できるため(5)、と同じ5です。また、中括弧は常に一連の式を含むブロックを定義するために使用でき、ブロックは最後の式を返します。この特殊なケースは、単一の式のブロックです。この場合、中括弧は括弧と同じ役割を果たします。これはすべて、式の前後に余分な括弧または中括弧をいつでも追加できることを意味します。したがって、以下はすべて同等です:123、、、{123}など。(123)({123})

これはまた、次のことを意味します。

invokeFunc(() => "this is a string")

と同じです

invokeFunc({ () => "this is a string" })

これはと同じです

invokeFunc({( () => "this is a string" )})

等々。

于 2013-02-28T11:05:55.620 に答える
6

私の理解では、最初の関数には匿名関数があり、2 番目の関数にはブロックがあります。ただし、ブロックの最後の要素は Scala で返されるため、ブロックは同じ無名関数を返し、それがメソッドのパラメーターになります。

于 2013-02-28T11:02:52.040 に答える