Skip to main content
 首页 » 编程设计

syntax之我可以在 Scala 中省略哪些字符

2024年12月31日23cyq1162

在 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 有三种类型的运算符符号,前缀(称为一元)、中缀和后缀。让我们在此处查看所有三个实例的示例:

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”是一个有效的对象——它是一个函数,而不是一个方法,所有的函数都是对象。

由于“0”不是有效的 Scala 标识符,因此它既不能是中缀也不能是后缀运算符。因此,Scala 提示它期望“;” -- 这将分隔两个(几乎)有效的表达式:“m”和“0”。如果你插入它,那么它会提示 m 需要一个参数,或者,如果失败,一个“_”将它变成一个部分应用的函数。