gpt4 book ai didi

scala - 为什么 Scala 编译器拒绝没有前导空格的函数体?

转载 作者:行者123 更新时间:2023-12-02 21:04:28 25 4
gpt4 key购买 nike

我发现这非常令人困惑。

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>

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

最佳答案

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

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)

如您所见,它尝试调用其他地方定义的 bool 变量 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

关于scala - 为什么 Scala 编译器拒绝没有前导空格的函数体?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15767297/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com