プロジェクト内で参照したいオープンソースプロジェクト用のSBTビルドを生成しようとしていましたが、コンパイラのバグです。scala 2.10コンパイラのscala.language.dynamicsバグの回避策
次のコードはコンパイルして実行します日食/ Scalaの-IDEで期待どおりに、しかしScalaの2.10.6コンパイラはそれを消化することができません:
package foo
import scala.language.dynamics
object Caller extends App {
val client = new Client() // initialise an R interpreter
client.x = 1.0
}
class Client extends Dynamic {
var map = Map.empty[String, Any]
def selectDynamic(name: String) = map get name getOrElse sys.error("field not found")
def updateDynamic(name: String)(value: Any) { map += name -> value }
}
ここに私のbuild.sbtです:
scalaVersion := "2.10.6"
libraryDependencies++= Seq(
"org.scalanlp" %% "breeze" % "0.12"
)
私はscalaVersion指定
:sの
[error] /home/philwalk/dynsbt/src/main/scala/foo/Caller.scala:8: type mismatch;
[error] found : foo.Caller.client.type (with underlying type foo.Client)
[error] required: ?{def x: ?}
[error] Note that implicit conversions are not applicable because they are ambiguous:
[error] both method any2Ensuring in object Predef of type [A](x: A)Ensuring[A]
[error] and method any2ArrowAssoc in object Predef of type [A](x: A)ArrowAssoc[A]
[error] are possible conversion functions from foo.Caller.client.type to ?{def x: ?}
[error] client.x = Seq("a","b","c")
[error] ^
[error] one error found
[error] (compile:compileIncremental) Compilation failed
[error] Total time: 3 s, completed May 3, 2016 11:03:08 AM
:= 2.10.6を、私は以下のコンパイルエラーを取得calaVersion:= 2.11.8、問題はありませんが、クロスコンパイルする必要がありますが、これは回避策ではありません。これに
client.x = 1.0
::私はscalac 2.10と直接コンパイルする場合
client.xx = 1.0
私も問題を参照してください
もう一つの手がかりは、私はこのコード行を変更することで、問題を隠すことができるということです。 6。
回避策として、私のプロジェクトではないので、フィールド名を1文字以上使用するようにプロジェクトをリファクタリングすることができましたが、私は回避策として受け入れることができます。また、それは簡単です.linalgプロジェクトであり、1文字の行列とベクトル名を使用不可にすることは深刻な制限です。
大きなプロジェクトからこの問題を解決するまで数時間かかってしまいましたが、私はこのオープンソースライブラリのscala 2.10バージョンに制限をかけたくないです。このバグはscala 2.11で修正されているようですので、2.10に修正をバックポートしないことに決めました。
解決方法(長いフィールド名)の存在を反映するようにタイトルを変更しました。
クリーンでコンパイルしてコンパイルした場合、エラーが発生しますか? – Martin
はい、非常に安定しており、繰り返し可能です。また、重複するのはとても簡単、あなただけのsrc /メイン/スカラ座/ fooの/ Client.scalaにあるファイルに上記のソースコードを貼り付け、その後、SBT 0.13.11でコンパイルしようとする必要があります(それはScalaの2.10にデフォルト設定されます。 6、起こるように)。 – philwalk
私はscalac 2.10.6を直接実行しようとしましたが、同じエラーが発生するので、これはsbtのエラーではないと思います。 sbtでは 'compile'を実行し、' last'を実行してscalacに与えられた正確なパラメータを取得します。編集:スカラREPLと同じですが、ライブラリの依存関係は必要ありません。 – Martin