2012-11-12 82 views
4

我與Scala Macros experimentin,這是斯卡拉2.10的一部分,但是當我嘗試編譯(使用SBT)我得到以下錯誤:斯卡拉2.10.0 RC2和可選參數

[error] .../API.scala:9: not enough arguments for constructor OAuth: 
(requestMethod: String, consumerSecret: String, consumerKey: String, 
signatureMethod: String, version: String)jm.oauth.OAuth 
[error] private val oauth = new OAuth(OAuth.POST, oauthConsumerSecret, 
oauthConsumerKey, OAuth.HMAC_SHA1) 

你可以找到執行OAuthhere

scala 2.10和可選參數之間是否有任何不兼容?

完全相同的代碼,用scala 2.9.1編譯完成。

+0

我設法通過使用scala 2.10 RC2重新編譯包含'OAuth'的庫來工作,但我想解釋一下發生了什麼,因爲我可能無法像我一樣重新編譯代碼。 我想了解更多,因爲我只是好奇:) – mariosangiorgio

+0

在版本之間跳轉時可能找不到默認參數名稱。請注意,構造函數實際上有五個參數,您試圖讓它填充最後一個(默認)參數。對於發生了什麼事情,並不是真正的答案。更多的是從哪裏開始尋找理解它的建議。 –

回答

7

如果您創建只包含這個類定義的文件:

class Optional(x: Int = 0) 

然後使用Scala 2.9.2編譯和結果類運行javap,你會看到這一點:

public class Optional implements scala.ScalaObject { 
    public static final int init$default$1(); 
    public Optional(int); 
} 

用2.10.0-RC2和javap重新編譯一遍,代之以:

public class Optional { 
    public static int $lessinit$greater$default$1(); 
    public Optional(int); 
} 

所以不行,默認參數在2.10中是完全正確的,您剛剛遇到了主要Scala版本之間缺乏二進制兼容性的具體示例。

+2

我想說的是「* major * Scala版本之間缺乏二進制兼容性」,就像在2.10.x和2.9.x版本中一樣。次要版本應該與其屬於同一主要版本的前任的源代碼和二進制兼容,例如, 2.9.2可以用來代替2.9.1而不用重新編譯任何東西。 –