2013-04-02 38 views

回答

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] = scal[email protected] 

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 
+0

謝謝,亞歷克斯!這有幫助。 –

2

斯卡拉不保留符號=>!

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

的標點字符的任意鄰接字符串不被保留該語言可用於定義。如果要定義包含標點符號和字母數字字符的符號,則必須在標點和字母數字之間的每個轉換處放置下劃線,反之亦然。如果沒有這樣做,一串輸入字符(如x+y)將是一個單獨的符號(就像它在Lisp中那樣)。

相關問題