Scalaバージョン2.11.8では、Intellijでソースコードを表示すると、Listクラスがvalエラーに再割り当てされます。 List.map関数のソースコード内の行278で例えばimmutable.Listソースコードに「Reassignment to val」というエラーがあります
:
t.tl = nx
IntelliJのショーヴァルに再割り当てが存在することを示すその行のエラーを分析します。ソースコードをチェックしたとき、 't'は変数ですが、 'tl'はValとして宣言されたコンストラクタパラメータです。
package scala.collection.immutable
@scala.SerialVersionUID(value = 509929039250432923)
final case class ::[B](override val head : B, private[scala] val tl : scala.collection.immutable.List[B]) extends scala.collection.immutable.List[B] with scala.Product with scala.Serializable {
override def tail : scala.collection.immutable.List[B] = { /* compiled code */ }
override def isEmpty : scala.Boolean = { /* compiled code */ }
}
私は、次の例のようなコードの一部だと思う:そして、ここでのIntelliJは、TLの宣言に私を指示するコードスニペットである。同様
class Test(val x: String)
var t: Test = new Test("test")
t.x = "test2"
、IntelliJのは、割り当てに同じエラーを示していtx = "test2"したがって、valエラーへの再割り当てがあっても、ソースコードは何になるのでしょうか。
IntelliJのバージョンは次のとおりです。 のIntelliJ IDEA 2016年2月3日 ビルド#IU-162.1812.17、2016年8月30日 JREの上に構築された:1.8.0_40-B26 AMD64 JVM:は、Java HotSpot(TM)64ビットサーバーVM by Oracle Corporation
一般的に私は、IntelliJがScalaコンパイラとコンパイルする必要があるものとそうでないものの両方に同意しないことがあります。 IIRC Scalaプラグインは、実際のコンパイラを使用するのではなく、コンパイラの一部を再実装しました。 – badcook
これは 'val'ではなく' val'で、https://github.com/scala/scala/blob/v2.11.8/src/library/scala/collection/immutable/List.scala#L439を参照してください。 –
@AlexeyRamanovソースコードのリンクありがとうございます。正しいですが、ソースコードでは、varと宣言されています。 SerialVersionUIDがgithubのソースコードと同じであっても、IntelliJ内で別のコードを表示するのは本当に面白いです –