题
在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)
中省略bralas?
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有三种类型的运算符表示法,前缀(称为一元),中缀和后缀。让我们看一下这三个实例的例子:
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标识符,但有关于限制后缀表示法的说法,只有四个标识符可用作前缀:〜,!, - 和+。
现在,当你尝试“m 0”时,Scala将其作为一元算子丢弃,理由是它不是有效的(〜,!, - 和+)。它发现“m”是指“m”。是一个有效的对象 - 它是一个函数,而不是一个方法,所有函数都是对象。
As&quot; 0&quot;不是有效的Scala标识符,它既不能是中缀也不能是后缀运算符。因此,Scala抱怨它期望“;” - 将两个(几乎)有效的表达分开:“m”和“0”。如果你插入它,那么它会抱怨m需要一个参数,或者,如果没有它,则需要一个“_”。把它变成部分应用的功能。
其他提示
我相信只有当您在左侧有一个显式对象时,运算符语法样式才有效。语法旨在让您表达“操作数运算符操作数”。风格操作以自然的方式。
不隶属于 StackOverflow