4

私の知る限り、Scala での中置演算子の使用は、メソッドの呼び出しと同等である必要があります。そう:

scala> "a" + 3.toString
res0: java.lang.String = a3

以下と同じです:

scala> "a".+(3.toString) 
res1: java.lang.String = a3

プレースホルダーがある場合、これが発生しない場合がありました。私はもっ​​と複雑なことをしていましたが、次のように蒸留できます。

scala> def x(f:(Int)=>String) = f(3)
x: (f: Int => String)String
scala> x("a" + _.toString)
res3: String = a3

ここまでは順調ですね。しかし...

scala> x("a".+(_.toString))
<console>:9: error: missing parameter type for expanded function ((x$1) => x$1.toString)
          x("a".+(_.toString))

ここの違いは何ですか?私は何が欠けていますか?

ジョルディ

4

2 に答える 2

11

プレースホルダーは、その機能_の一番上にのみ表示できます。Exprつまり

(_.toString)

はそれ自体が関数であり"a" + some function of unknown type、コンパイラにはあまり意味がありません。

于 2012-07-03T12:56:44.850 に答える
10

中置表記の評価は正しいですが、プレースホルダー パラメーターの理解には欠陥があります。

アンダースコアをプレースホルダー パラメーターとして使用すると、関数が作成されます。問題は、その機能の境界は何かということです。どこから始まり、どこで終わるのでしょうか? たとえば、次の式を考えてみましょう。

_ + _ + _

それはどのように翻訳されるべきですか?いくつかの代替手段を次に示します。

(x, y, z) => { x + y + z }
(x, y) => { (z) => { x + y } + z }
(x) => { x + { (y, z) => y + z } }

Scala の規則では、スコープは最も内側の括弧で区切られた式、またはそれ以外の式全体です。したがって、実際には、次の 2 つの異なる内容を記述しました。

x("a" + _.toString) // is the same thing as
x((y) => "a" + y.toString)

x("a".+(_.toString)) // is the same thing as
x("a".+((y) => y.toString))
于 2012-07-03T15:15:37.350 に答える