質問
Scalaでは、次の T m 0
( T.m(0)
ではなく)でドットとブレットを省略することができるのはなぜですか?
scala> object T { def m(i:Int) = 0 == i }
defined module T
scala> T m 0
res19: Boolean = true
しかし、以下の n(0)
でブレットを省略できないのはなぜですか?
scala> def n(i:Int) = 0 == i
n: (Int)Boolean
scala> n 0
<console>:1: error: ';' expected but integer literal found.
n 0
^
解決
前者の例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
}
ここで使用中:
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
中置記法と後置記法は有効なScala識別子を受け入れますが、後置記法を制限するという話はありますが、接頭辞として使用できる識別子は〜、!、-、+の4つだけです。
今、「m 0」を試してみると、Scalaは有効な演算子(〜、!、-、+)ではないという理由で、単項演算子であることを破棄します。 &quot; m&quot;有効なオブジェクトです-メソッドではなく関数であり、すべての関数はオブジェクトです。
As&quot; 0&quot;は有効なScala識別子ではありません。中置演算子でも後置演算子でもありません。そのため、Scalaは&quot ;;&quot;を期待していたと文句を言います。 -2つの(ほぼ)有効な式を分離します:&quot; m&quot;および「0」。挿入した場合、mには引数が必要であるか、それが失敗すると&quot; _&quot;部分的に適用された関数に変換します。
他のヒント
演算子の構文スタイルは、左側に明示的なオブジェクトがある場合にのみ機能すると考えています。この構文は、「オペランド演算子オペランド」を表現できるようにすることを目的としています。自然な方法で操作をスタイルします。
所属していません StackOverflow