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

そうです、最初のバージョンを正しく解析できません。最初のオプションと 2 番目のオプションで生成されるツリーの違いは次のとおりです。

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 に答える