私はScalaの初心者であり、メソッドを呼び出すためのいくつかの異なる構文を見ました。パラメータのないメソッドの括弧を無視したり、のようにドットを無視したりするなど、いくつかは便利です。
1 to 10
しかし、本当に私を困惑させる人もいます。例えば:
breakable { ... }
これは単にメソッド呼び出しですよね?複数のパラメーターまたはパラメーターなしの関数ではないパラメーターに対してもそれを行うことはできますか?
ありがとう
メソッドを呼び出す標準的な方法は 2 つあります。
obj.method(params) // dot notation
obj method (params) // operator notation
上記は、次の方法で変更できます。
params
が単一のパラメーターの場合は、 に置き換えること()
ができます{}
。params
が単一のパラメーターで、演算子表記を使用している場合は、括弧を削除できます。method
パラメータを取らない場合は、削除できます((params)
つまり、空の を削除します()
)。method
で終わる場合:
、実際には演算子表記で右にバインドされます。つまり、(params) method_: obj
と同等obj.method_:(params)
です。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)
もしも:
method
スコープにインポートされました。優先順位の問題もあることに注意してください。と書くと、たとえスコープにインポートされたとしてもobj method(params)
、Scala は にmethod
属していると推定します。obj
これを脱糖すると、次のようになります。
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
上記はカリー化された関数の例です