ファイルを生成する段階で、型情報が削減されることがある • 例 [2, 5] $ vim TypeErasure.scala val xs: List[Int] = List(1, 2, 3) val x = xs(0) :wq $ cs launch scala3-compiler -- TypeErasure.scala $ javap TypeErasure\$package\$ Compiled from "TypeErasure.scala" public final class TypeErasure$package$ implements java.io.Serializable { public static final TypeErasure$package$ MODULE$; public static {}; public scala.collection.immutable.List<java.lang.Object> xs(); public int x(); }
ファイルを生成する段階で、型情報が削減されることがある $ vim TypeErasure.scala val xs: List[Int] = List(1, 2, 3) val x = xs(0) :wq $ cs launch scala3-compiler -- TypeErasure.scala $ javap TypeErasure\$package\$ Compiled from "TypeErasure.scala" public final class TypeErasure$package$ implements java.io.Serializable { public static final TypeErasure$package$ MODULE$; public static {}; public scala.collection.immutable.List<java.lang.Object> xs(); public int x(); } List[Int] → List<Object> になっている x: Int を取得するときはキャストされている Scala 3 の Union Type とかも無くなる
• for ループを表す、do が追加 def forFunc1(xs: Seq[Int]) = for (x <- xs if x > 0) yield x*x def forFunc2(xs: Seq[Int], ys: Seq[Int]) = for { x <- xs y <- ys } yield println(x + y) def forFunc1(xs: Seq[Int]) = for x <- xs if x > 0 yield x * x def forFunc2(xs: Seq[Int], ys: Seq[Int]) = for x <- xs y <- ys do println(x + y) Scala 2 Scala 3
of TASTy, https://docs.scala-lang.org/scala3/guides/tasty-overview.html [3] Dotty, https://github.com/lampepfl/dotty/tree/master/tasty-inspector/src/scala/tasty/inspector [4] scala3-tasty-inspector.g8, https://github.com/scala/scala3-tasty-inspector.g8 [5] javapコマンドでクラスファイルを読む, https://atmarkit.itmedia.co.jp/ait/articles/0407/13/news102.html [6] Macros: the Plan for Scala 3, https://www.scala-lang.org/blog/2018/04/30/in-a-nutshell.html [7] New in Scala 3, https://docs.scala-lang.org/ja/scala3/new-in-scala3.html [8] New Control Syntax, https://docs.scala-lang.org/scala3/reference/other-new-features/control-syntax.html 参考リンク