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

标签 syntax scala

在 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 需要一个参数,或者,如果失败,一个“_”将它变成一个部分应用的函数。

关于syntax - 我可以在 Scala 中省略哪些字符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1006967/

相关文章:

c - 在 C 函数声明中, "..."作为最后一个参数有什么作用?

java - 对简单的 java 语法感到困惑 - 新手程序员

scala - 为什么此Scala隐式参数示例不起作用?

scala - Play Scala 依赖注入(inject) : How to use it

scala - 由 : java. sql.SQLException : JDBC4 Connection. isValid() 方法引起不支持

c# - 对 BigIntegers 列表求和

php - 引用 PHP 中的静态方法?

ruby - 为什么 `a (b.c do;end)` 不是句法正确的 Ruby 程序?

scala - 在 play2 剪影 JWTAuthenticator 中获取 JWT token

scala - 设置使SBT在错误时快速失败(停止)