Syntax 在Scala中可以省略哪些字符?

Syntax 在Scala中可以省略哪些字符?,syntax,scala,Syntax,Scala,在Scala中,为什么我可以在下面的TM 0(而不是T.m(0))中省略点和括号 scala> object T { def m(i:Int) = 0 == i } defined module T scala> T m 0 res19: Boolean = true scala> def n(i:Int) = 0 == i n: (Int)Boolean scala> n 0 <console>:1: error: ';' expected but i

在Scala中,为什么我可以在下面的
TM 0
(而不是
T.m(0)
)中省略点和括号

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

scala> T m 0
res19: Boolean = true
scala> def n(i:Int) = 0 == i
n: (Int)Boolean

scala> n 0
<console>:1: error: ';' expected but integer literal found.
       n 0
         ^
但是为什么我不能在下面的
n(0)
中省略刹车

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

scala> T m 0
res19: Boolean = true
scala> def n(i:Int) = 0 == i
n: (Int)Boolean

scala> n 0
<console>:1: error: ';' expected but integer literal found.
       n 0
         ^
scala>defn(i:Int)=0==i
n:(Int)布尔
scala>n0
:1:错误:';'应为整型文字,但找到整型文字。
n0
^

我认为运算符语法样式只有在左侧有显式对象时才有效。语法旨在让您以自然的方式表示“操作数-运算符-操作数”样式的操作。

前一个示例T m 0是“运算符表示法”的示例。Scala有三种类型的运算符符号:前缀(称为一元)、中缀和后缀。让我们看看这三个例子:

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标识符,但尽管有人说要限制后缀符号,但只有四个标识符可以用作前缀:~,!,-和+

现在,当您尝试“m0”时,Scala会放弃它作为一元运算符,理由是它不是一个有效的运算符(~、!、-和+)。它发现“m”是一个有效的对象——它是一个函数,而不是一个方法,所有函数都是对象


由于“0”不是有效的Scala标识符,因此它既不能是中缀运算符也不能是后缀运算符。因此,Scala抱怨说它期望“;”——这将分隔两个(几乎)有效的表达式:“m”和“0”。如果你插入了它,它会抱怨m需要一个参数,或者,如果没有,需要一个“u”来将它转换成一个部分应用的函数。

我不知道显式对象是什么意思,但是你可以在你的左边有一个对象,对吗?(…左?)不列表使用:::和::作为前缀表示法?@asperous.us No.以
结尾的运算符有不同的用法:它们是右关联而不是左关联,但它们都是中缀运算符。