4

我发现这非常令人困惑。

scala> val a = (x:Boolean)=>!x
<console>:7: error: not found: value x
       val a = (x:Boolean)=>!x
                ^

scala> val a = (x:Boolean)=> !x
a: Boolean => Boolean = <function1>

两者之间的唯一区别是空格。是因为词法分析器考虑=>!了运算符吗?

4

2 回答 2

6

你是对的,它无法正确解析第一个版本。以下是它为第一个和第二个选项生成的树的差异:

scala> import scala.reflect.runtime.{universe => u}
import scala.reflect.runtime.{universe=>u}

scala> import scala.reflect.runtime.{currentMirror => m}
import scala.reflect.runtime.{currentMirror=>m}

scala> import scala.tools.reflect.ToolBox
import scala.tools.reflect.ToolBox

scala> val tb = m.mkToolBox()
tb: scala.tools.reflect.ToolBox[reflect.runtime.universe.type] = scala.tools.reflect.ToolBoxFactory$ToolBoxImpl@4426fc2e

scala> val treeNotWorking = tb.parse("(x:Boolean)=>!x")
treeNotWorking: tb.u.Tree = (x: Boolean).$eq$greater$bang(x)

scala> val treeWorking = tb.parse("(x:Boolean) => !x")
treeWorking: tb.u.Tree = ((x: Boolean) => x.unary_$bang)

如您所见,它尝试调用在别处定义=>!的布尔变量。x例如,如果我们x在范围内,我们会得到一个不同的错误:

scala> val x = true
x: Boolean = true

scala> val a = (x:Boolean)=>!x
<console>:17: error: value =>! is not a member of Boolean
       val a = (x:Boolean)=>!x
于 2013-04-02T15:11:40.703 回答
2

Scala 不保留符号=>!

scala> val =>! = 42
=>!: Int = 42

任何未被该语言保留的连续标点字符字符串都可用于定义。如果要定义一个同时包含标点符号和字母数字字符的符号,则必须在标点符号和字母数字之间的每个转换处放置一个下划线,反之亦然。如果它不这样做,一串输入字符,例如,x+y将是单个符号(就像在 Lisp 中一样)。

于 2013-04-02T15:25:52.527 回答