前者の例T m 0は、「オペレータ表記」の例である。 Scalaには、接頭辞(単項と呼ばれる)、中置と後置の3種類の演算子表記法があります。のは、ここにアクションですべての3つの例を見てみましょう:
class MyByte(val n : Int) {
require(n >= 0 && n <= 255)
def unary_! = new MyByte(n^0xff)
def +(m : MyByte) = new MyByte(n + m.n)
def bits = (math.log(n)/math.log(2) + 1).toInt
override def toString = "0" * (8 - bits) + n.toBinaryString
}
Anが、ここでそれが使用されている:
scala> val a = new MyByte(5)
a: MyByte = 00000101
scala> val b = new MyByte(10)
b: MyByte = 00001010
scala> ! a // Prefix/Unary
res58: MyByte = 11111010
scala> a + b // Infix
res59: MyByte = 00001111
scala> b bits // Postfix
res60: Int = 4
後置記法を制限する話があるが中置とpostfixの表記法は、任意の有効なScalaの識別子を受け入れながら接頭辞として〜、!、 - 、+の4つの識別子しか使用できません。
「m 0」を試してみると、有効なもの(〜、!、 - 、+)ではないため、スカラはそれを単項演算子として破棄します。 "m"は有効なオブジェクトであることがわかります。これはメソッドではなく関数であり、すべての関数はオブジェクトです。
"0"は有効なScala識別子ではないため、中置演算子も後置演算子も使用できません。したがって、Scalaは、それが ";" - 2つの(ほぼ)有効な式 "m"と "0"を分離します。あなたがそれを挿入した場合、mが引数を必要とするか、失敗すると、それを部分的に適用された関数に変換するための "_"が必要です。
リストには接頭辞表記として:::と::を使用していませんか? – andychase
@ asperous.usいいえ、 ':'で終わる演算子は異なる[fixity](http://en.wikipedia.org/wiki/Operator_associativity)です:_left associative_ではなく_right associative_ですが、中置演算子ですすべて同じ。 –