scala Option[Int] 原语装箱和拆箱
scala Option[Int] primitive Boxing and Unboxing
您好,我有一个关于拳击和 IntelliJ 脱糖菜单的问题。
因此,当我将一个 Int 例如包装到一个 Scala 选项中时,我希望原语会被装箱一次,但是当我在 IntelliJ 中对 Scala 代码进行去糖处理时,我得到一个值被装箱 5 次或更多次
object App {
def main(args: Array[String]): Unit = {
val a: Option[Int] = Some(1)
}
}
现在,当我使用“脱糖”菜单时,我得到了这个代码
object App {
def main(args: Array[String]): Unit = {
val a: Option[Int] = Some.apply(
Predef.Integer2int(scala.runtime.BoxesRunTime.boxToInteger(
Predef.Integer2int(scala.runtime.BoxesRunTime.boxToInteger(
Predef.Integer2int(scala.runtime.BoxesRunTime.boxToInteger(
Predef.Integer2int(scala.runtime.BoxesRunTime.boxToInteger(
Predef.Integer2int(scala.runtime.BoxesRunTime.boxToInteger(
Predef.Integer2int(scala.runtime.BoxesRunTime.boxToInteger(
Predef.Integer2int(scala.runtime.BoxesRunTime.boxToInteger(
Predef.Integer2int(scala.runtime.BoxesRunTime.boxToInteger(
Predef.Integer2int(scala.runtime.BoxesRunTime.boxToInteger(
Predef.Integer2int(scala.runtime.BoxesRunTime.boxToInteger(
1
)))))))))))))))))))))
}
}
其中有很多次原始盒子。现在这似乎会使我的代码膨胀。
为什么它需要将 Option[Int] 装箱那么多次。
听起来很奇怪,会不会是 IntelliJ 的产物?
在命令行中使用 scala 2.12.5 作为:
./scala -Xprint:typer -e "val a: Option[Int] = Some(1)"
它似乎产生了一个调用:
private[this] val a: Option[Int] = scala.Some.apply[Int](1);
完整结果为:
[[syntax trees at end of typer]] // scalacmd4175089397487439052.scala
package <empty> {
object Main extends scala.AnyRef {
def <init>(): Main.type = {
Main.super.<init>();
()
};
def main(args: Array[String]): Unit = {
final class $anon extends scala.AnyRef {
def <init>(): <$anon: AnyRef> = {
$anon.super.<init>();
()
};
private[this] val a: Option[Int] = scala.Some.apply[Int](1);
<stable> <accessor> private def a: Option[Int] = $anon.this.a
};
{
new $anon();
()
}
}
}
}
这是一个错误,已被 IntelliJ 接受为错误
您好,我有一个关于拳击和 IntelliJ 脱糖菜单的问题。
因此,当我将一个 Int 例如包装到一个 Scala 选项中时,我希望原语会被装箱一次,但是当我在 IntelliJ 中对 Scala 代码进行去糖处理时,我得到一个值被装箱 5 次或更多次
object App {
def main(args: Array[String]): Unit = {
val a: Option[Int] = Some(1)
}
}
现在,当我使用“脱糖”菜单时,我得到了这个代码
object App {
def main(args: Array[String]): Unit = {
val a: Option[Int] = Some.apply(
Predef.Integer2int(scala.runtime.BoxesRunTime.boxToInteger(
Predef.Integer2int(scala.runtime.BoxesRunTime.boxToInteger(
Predef.Integer2int(scala.runtime.BoxesRunTime.boxToInteger(
Predef.Integer2int(scala.runtime.BoxesRunTime.boxToInteger(
Predef.Integer2int(scala.runtime.BoxesRunTime.boxToInteger(
Predef.Integer2int(scala.runtime.BoxesRunTime.boxToInteger(
Predef.Integer2int(scala.runtime.BoxesRunTime.boxToInteger(
Predef.Integer2int(scala.runtime.BoxesRunTime.boxToInteger(
Predef.Integer2int(scala.runtime.BoxesRunTime.boxToInteger(
Predef.Integer2int(scala.runtime.BoxesRunTime.boxToInteger(
1
)))))))))))))))))))))
}
}
其中有很多次原始盒子。现在这似乎会使我的代码膨胀。
为什么它需要将 Option[Int] 装箱那么多次。
听起来很奇怪,会不会是 IntelliJ 的产物?
在命令行中使用 scala 2.12.5 作为:
./scala -Xprint:typer -e "val a: Option[Int] = Some(1)"
它似乎产生了一个调用:
private[this] val a: Option[Int] = scala.Some.apply[Int](1);
完整结果为:
[[syntax trees at end of typer]] // scalacmd4175089397487439052.scala
package <empty> {
object Main extends scala.AnyRef {
def <init>(): Main.type = {
Main.super.<init>();
()
};
def main(args: Array[String]): Unit = {
final class $anon extends scala.AnyRef {
def <init>(): <$anon: AnyRef> = {
$anon.super.<init>();
()
};
private[this] val a: Option[Int] = scala.Some.apply[Int](1);
<stable> <accessor> private def a: Option[Int] = $anon.this.a
};
{
new $anon();
()
}
}
}
}
这是一个错误,已被 IntelliJ 接受为错误