我发现这很令人困惑。
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>
两者之间的唯一区别是空白。是因为词法分析员认为=>!
是算子吗?
答案 0 :(得分: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
答案 1 :(得分:2)
Scala不保留符号=>!
:
scala> val =>! = 42
=>!: Int = 42
该语言未保留的任何连续的标点符号字符串可供定义。如果要定义包含标点符号和字母数字字符的符号,则必须在标点符号和字母数字之间的每个过渡处放置下划线,反之亦然。如果它没有这样做,一串输入字符如x+y
将是一个单独的符号(例如,在Lisp中)。