2009-06-17 10 views
22

Scalaでは、ドットとブラックをの代わりにT m 0に省略することはできますか?Scalaではどの文字を省略できますか?

scala> object T { def m(i:Int) = 0 == i } 
defined module T 

scala> T m 0 
res19: Boolean = true 

しかし、私は、次の中n(0)でbraketsを省略することはできませんなぜですか?

scala> def n(i:Int) = 0 == i 
n: (Int)Boolean 

scala> n 0 
<console>:1: error: ';' expected but integer literal found. 
     n 0 
     ^

答えて

36

前者の例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が引数を必要とするか、失敗すると、それを部分的に適用された関数に変換するための "_"が必要です。

+0

リストには接頭辞表記として:::と::を使用していませんか? – andychase

+1

@ asperous.usいいえ、 ':'で終わる演算子は異なる[fixity](http://en.wikipedia.org/wiki/Operator_associativity)です:_left associative_ではなく_right associative_ですが、中置演算子ですすべて同じ。 –

3

オペレータの構文スタイルは、左側に明示的なオブジェクトがある場合にのみ有効です。この構文は、「オペランドオペランドオペランド」スタイルのオペレーションを自然な方法で表現できるようにするためのものです。

+1

私はあなたが明示的なオブジェクトによって何を意味するのか分かりませんが、あなたの左側のオブジェクトに評価するものはかなりありますか? (... left?) –

関連する問題