在删除:和=>之间的空格时,为什么Scala By-Name参数语法失败

mad*_*ine 0 syntax scala identifier lexical-analysis

我只是在思考Scala的命名参数语法.我创建了下面运行的代码片段,它工作正常.但是,当我删除之间的空格a: =>Inta:=>Int,它失败了.

这没有任何问题:

object Calculator extends App {
  def sum(a: => Int) = (b: Int) => a + b
  println(sum(4)(5))
}
Run Code Online (Sandbox Code Playgroud)

当我删除第2行中的空格时,以下内容失败并出现语法错误sum(a:=>Int):

object Calculator extends App {
  def sum(a:=> Int) = (b: Int) => a + b
  println(sum(4)(5))
}
Run Code Online (Sandbox Code Playgroud)

为什么第二个代码片段不能编译?

And*_*kin 6

在词法分析期间,它在第一阶段失败,因为:=>它是有效的Scala标识符:

val :=> = 42
println(:=>)  // prints 42
Run Code Online (Sandbox Code Playgroud)

因此,你的代码

def sum(a:=> Int) = ??? // wrong: unexpected identifier `:=>`
Run Code Online (Sandbox Code Playgroud)

就像说的那样无效

def sum(a+= Int) = ??? // wrong: unexpected identifier `+=`
Run Code Online (Sandbox Code Playgroud)

要么

def sum(a:: Int) = ??? // wrong: unexpected identifier `::`
Run Code Online (Sandbox Code Playgroud)