12

私はScalaの初心者であり、メソッドを呼び出すためのいくつかの異なる構文を見ました。パラメータのないメソッドの括弧を無視したり、のようにドットを無視したりするなど、いくつかは便利です。

1 to 10

しかし、本当に私を困惑させる人もいます。例えば:

breakable { ... }

これは単にメソッド呼び出しですよね?複数のパラメーターまたはパラメーターなしの関数ではないパラメーターに対してもそれを行うことはできますか?

ありがとう

4

2 に答える 2

26

メソッドを呼び出す標準的な方法は 2 つあります。

obj.method(params)   // dot notation
obj method (params)  // operator notation

上記は、次の方法で変更できます。

  1. paramsが単一のパラメーターの場合は、 に置き換えること()ができます{}
  2. paramsが単一のパラメーターで、演算子表記を使用している場合は、括弧を削除できます。
  3. methodパラメータを取らない場合は、削除できます((params)つまり、空の を削除します())。
  4. methodで終わる場合:、実際には演算子表記で右にバインドされます。つまり、(params) method_: objと同等obj.method_:(params)です。
  5. いずれにせよ、識別子を区別できる限り、スペースはオプションです。そのため、次の行にスペースを追加しobj . method ( params )たり、次の行に書き込むことができます.method(params)(呼び出しチェーンでよくあることです)。また、 のように、演算子表記からスペースを削除することもできますa+b

タプル推論に関するものもありますが、私はそれを避けようとしているので、正確なルールはわかりません。

ただし、これらのどれも、あなたが混乱している例を説明するものではありません. ただし、説明する前に、メソッドの呼び出しにも使用できる構文糖衣をいくつか示したいと思います。

obj(params) // equivalent to obj.apply(params)
obj.x = y   // equivalent to obj.x_=(y), if obj.x also exists
obj(x) = y  // equivalent to obj.update(x, y)
obj op= y   // equivalent to obj = obj op y, if op is symbolic
~obj        // equivalent to obj.unary_~; also for !, + and -, but no other symbol

さて、あなたが与えた例に移りましょう。安定した値のメンバーをインポートできます。Java はその静的インポートを使用して静的メソッドに対してそれを行うことができますが、Scala にはより一般的なメカニズムがあります。パッケージ、オブジェクト、または共通インスタンスからのインポートも例外ではありません。型メンバーと値メンバーの両方をもたらします。メソッドは後者のカテゴリに分類されます。

だから、あなたが持っていると想像してくださいval a = 2、そしてあなたはそうしますimport a._。これにより、すべてのメソッドがスコープIntに含まれるため、それらを直接呼び出すことができます。+(2)の呼び出しとして解釈されるため、実行できませんが、たとえば次のようにunary_+呼び出すことができます。*(4)

scala> val a = 2
a: Int = 2

scala> import a._
import a._

scala> *(4)
res16: Int = 8

さて、ルールはこうです。あなたは呼び出すことができます

method(params)

もしも:

  1. methodスコープにインポートされました。
  2. 括弧を保持します (パラメーターが 1 つしかない場合でも)

優先順位の問題もあることに注意してください。と書くと、たとえスコープにインポートされたとしてもobj method(params)、Scala は にmethod属していると推定します。obj

于 2012-08-10T15:31:27.730 に答える
15

これを脱糖すると、次のようになります。

breakable({ ... }) 

これは署名に一致します

breakable: (op: ⇒ Unit): Unit 

その名前の呼び出し引数を使用します(これは、コードのブロックを引数として渡すと考えることができます)

さらにscalaを使用すると、次のように記述できます。

scala> def foo (op1: => Unit)(op2: => Unit) = {op1;op2;}
foo: (op1: => Unit)(op2: => Unit)Unit

scala> foo { println(1) } { println(2) }
1
2

上記はカリー化された関数の例です

于 2012-08-10T09:57:38.427 に答える