2013-07-08 153 views
1

這是我的代碼。我想寫7的表達式? & 10?以便編譯。斯卡拉語法糖

object Test { 
    trait A { 
    def &(other: A) = ??? 
    } 
    case class B(i: Int) extends A 
    implicit class C(i: Int) { 
    def ? : A= B(i) 
    } 
    val u = 7? 
    val v = 10? 
    val w = u & v // Ok, it compiles 
    val z = 7? & 10? //';' expected but 10 found 
    val g = 7.? & 10? //';' expected but 10 found 
    val h = (7?) & 10? //Type mismatch. found Int(10). Required Test.A 
    val i = 7? & (10?) //Test.A does not take parameters (on the ?) 
} 

爲什麼我不能寫7? & 10?通過寫入太不同的方式,可以用6個字符來編寫此表達式嗎?

+0

好,通過使用前綴符號用!而不是?,我可以保留我的六個字符'!7&!10' –

回答

1

編譯-Xfuture用點號上的INT:

[email protected]:~/tmp$ scala -Xfuture 
Welcome to Scala version 2.10.1 (OpenJDK 64-Bit Server VM, Java 1.7.0_21). 
[your stuff here] 

scala> 7.? & 10.? 
scala.NotImplementedError: an implementation is missing 
0

Scala編譯器解釋7 ? &此行是一個簡單的高階方法調用:7.?(&),因爲它是一個有效的Scala代碼,scalac不會找隱分辨率和扔你一個語法錯誤。

+0

它仍然不會編譯(Scala 2.10.2),因爲它試圖組成一個'Double'文字。 –

+0

@ 0__是的,檢查它,你說得對,但問題仍然在於方法調用解釋 – 4lex1v

2

正如Alexiv指出的那樣,問題在於,在使用postfix syntax作爲一元運算符後,不能放置二元運算符。 Postfix語法存在多個問題,這就是爲什麼Scala 2.10會警告您,除非您啓用特殊語言功能。

所以理論上7.? & 10.?應該工作。但是現在你遇到了整數和浮點文字之間的模糊問題。從Scala的語言規範§1.3.2「浮點字面」:

如果程序中字面浮點後跟以字母開頭的令牌,必須有至少一個居間的之間空白字符兩個令牌。

因此,這裏規則的定義方式與此相反,即Scala似乎首先假設了一個浮點數,並假設了整數秒。 7.?將被解釋爲Double上的方法,而7.xInt上的方法,並且如果需要Double上的方法,則必須編寫7. x

沒有怎麼做到相反? 廣場前的空間期間

7 .? & 10 .? 

...當然,這使得它只要使用括號

(7?) & (10?) 

所以你沒有得到你的6個字符,但隨後爲什麼需要那麼短?

+0

黑客與空格,非常酷,沒有想到這個 – 4lex1v

+0

作爲一個附註,Scala定義了「$」和「 '_'作爲大寫字母。你可以編寫'7. $&10. $'或者甚至是'。$&10. $'。但誰會理解這種表達的含義? –

+0

請注意,您可以放棄第二個之前的時間段,並添加一個隱式方法(以及您現有的隱式類) - 例如,隱式def toA(i:Int):A = B(i)'你可以放棄第二個參數的括號(即使你的val h =(7?)&10?'line above compile) – Shadowlands