だから私はScalaでバトルコードプレーヤーを書くことで遊んでいます。バトルコードでは、特定のクラスが許可されておらず、それらにアクセスしようとすると実行時例外が発生します。Array.fill関数を使用すると、バトルコードサーバーから。というメッセージが表示されます[java] Illegal class: scala/reflect/Manifest$
。これは問題のある行です:
val g_score = Array.fill[Int](rc.getMapWidth(), rc.getMapHeight())(0)
ClassManifest
このメソッドは、次のドキュメントを持つ暗黙の引数を取ります。
A ClassManifest[T] is an opaque descriptor for type T. It is used by the compiler
to preserve information necessary for instantiating Arrays in those cases where
the element type is unknown at compile time.
しかし、コンパイル時に配列要素のタイプを知っています。上に示したように、それらがになることを明示的に述べていますInt
。これを回避する方法はありますか?回避策として、独自のバージョンのを作成しましたArray.fill
。これはハックのようです。余談ですが、Scalaには実際の2Dアレイがありますか? 私が自分で書くために見つけた唯一の方法であるArray.fill
を返すようです。Array[Array[T]]
これもエレガントではないようです。
編集:Scala2.9.1の使用