7

私は簡単なアプリケーションを持っています:

object Test extends App {
  implicit def t2mapper[X, X0 <: X, X1 <: X](t: (X0, X1)) = new {
    def map[R](f: X => R) = (f(t._1), f(t._2))
  }
  println("Hello!")
  val (foo, bar) = (1, 2) map (_ * 2)
  println((foo, bar))
}

(これt2mapperこの回答からのものです。)

コードは正常にコンパイルされます。

$ scalac -version
Scala compiler version 2.9.1 -- Copyright 2002-2011, LAMP/EPFL
$ scalac -unchecked Test.scala
$ 

しかし、実行すると、IllegalAccessError(印刷される前に)をスローします: Hello!

$ java -version
Javaバージョン「1.6.0_24」
OpenJDKランタイム環境(IcedTea6 1.11.1)(6b24-1.11.1-4ubuntu3)
OpenJDKサーバーVM(ビルド20.0-b12、混合モード)
$scalaテスト
java.lang.IllegalAccessError:クラスTest $ delayedInit$bodyからフィールドTest$.reflParams$Cache1にアクセスしようとしました
        Test $ delayedInit $ bodyで。(Test.scala:6)
        Test $で。(Test.scala:1)
        Test $で。(Test.scala)
        Test.main(Test.scala)で
        sun.reflect.NativeMethodAccessorImpl.invoke0(ネイティブメソッド)で
        sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)で
        sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)で
        java.lang.reflect.Method.invoke(Method.java:616)で
        scala.tools.nsc.util.ScalaClassLoader $$ anonfun $ run $ 1.apply(ScalaClassLoader.scala:78)で
        scala.tools.nsc.util.ScalaClassLoader $ class.asContext(ScalaClassLoader.scala:24)で
        scala.tools.nsc.util.ScalaClassLoader $ URLClassLoader.asContext(ScalaClassLoader.scala:88)で
        scala.tools.nsc.util.ScalaClassLoader $ class.run(ScalaClassLoader.scala:78)で
        scala.tools.nsc.util.ScalaClassLoader $ URLClassLoader.run(ScalaClassLoader.scala:101)で
        scala.tools.nsc.ObjectRunner $ .run(ObjectRunner.scala:33)で
        scala.tools.nsc.ObjectRunner $ .runAndCatch(ObjectRunner.scala:40)で
        scala.tools.nsc.MainGenericRunner.runTarget $ 1(MainGenericRunner.scala:56)で
        scala.tools.nsc.MainGenericRunner.process(MainGenericRunner.scala:80)で
        scala.tools.nsc.MainGenericRunner $ .main(MainGenericRunner.scala:89)で
        scala.tools.nsc.MainGenericRunner.main(MainGenericRunner.scala)で

最後の2行がに置き換えられていることに注意してください

  println((1, 2) map (_ * 2))

また

  val (foo, bar) = (2, 4)
  println((foo, bar))

また

  val intermediate = (1, 2) map (_ * 2)
  val (foo, bar) = intermediate
  println((foo, bar))

期待どおりに印刷(2,4)されます。しかし、ブロックに包まれたとき

  {
    val intermediate = (1, 2) map (_ * 2)
    val (foo, bar) = intermediate
    println((foo, bar))
  }

また

  private val blah = {
    val intermediate = (1, 2) map (_ * 2)
    val (foo, bar) = intermediate
    println((foo, bar))
  }

例外をスローします。

最初と最後の方法でJVMが実行時にエラーをスローするのはなぜですか?

4

1 に答える 1

5

関連する未解決のバグがいくつかあるようです。たとえば、これは関連している可能性があります。

https://issues.scala-lang.org/browse/SI-5251?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel

main拡張する代わりにメソッドを作成することもでき、それが機能することに注意してくださいApp

編集:

この行を使用する場合(暗黙的に展開しました):

val (foo, bar) = t2mapper((1, 2)) map (_ * 2)

そして、マウスオーバーfooまたはbarEclipseでは、が表示されますprivate[this] val foo

したがって、SI-5251と非常によく似ているようです。

于 2012-07-02T23:32:42.490 に答える