0

重複の可能性:
Scala でのアンダースコアのすべての用途は何ですか?

特定のチュートリアルに従うと、次の 2 つの使用法で同じ結果が得られることがわかりました。最初のものは理解できますが、2番目のものも機能する理由がわかりません。誰かが私に説明をしてくれると同時に、_使用法の概要を教えてもらえますか?

def sum (a:Int, b:Int) = a + b

val sumAsFunction1 = sum(_:Int, _:Int)  
// I understand this, _ used as placeholder of parameters

val sumAsFunction2 = sum _
// why this usage has the same effect as sumAsFunction1?
4

2 に答える 2

1

これは、 eta-expansionメカニズムが助けを必要とする数少ない場所の 1 つです。より簡単な例を考えてみましょう:

def foo() = {
  println("foo"); 
  42
}

val bar1 = foo
val bar2 = foo _

と の間には根本的な違いがbar1ありbar2ます。前者は呼び出しとして解釈されfoo、値をに割り当てますがbar、後者はメソッドfooを関数に変更し、それをに割り当てますbar2。結果として、bar1は単なるInt変数ですが、実際には元のメソッド (および print )bar2を呼び出す関数です。foo()"foo"

于 2012-05-26T18:42:09.543 に答える
1

アンダースコアは多くのことに使用されますが、この状況では、呼び出されていないバージョンのsum関数が必要であることを示すために使用されます。

を定義するsum(a: Int, b:Int) = a + bのでsum _、2 つの引数を取り、それらの合計を返す無名関数と考えてください。Function2[Int,Int,Int]のインスタンスであるため、関数を渡すことができます。

于 2012-05-26T18:42:56.077 に答える