¿Por qué este código Scala:¿Por qué Scala construye un nuevo Tuple al desempaquetar un Tuple?
class Test
{
def foo: (Int, String) =
{
(123, "123")
}
def bar: Unit =
{
val (i, s) = foo
}
}
generar el siguiente código de bytes para bar()
que construye un nuevo Tuple2
, pasa el Tuple2
de foo()
a él y luego obtiene los valores fuera de él?
public void bar();
Code:
0: aload_0
1: invokevirtual #28; //Method foo:()Lscala/Tuple2;
4: astore_2
5: aload_2
6: ifnull 40
9: new #7; //class scala/Tuple2
12: dup
13: aload_2
14: invokevirtual #32; //Method scala/Tuple2._1:()Ljava/lang/Object;
17: aload_2
18: invokevirtual #35; //Method scala/Tuple2._2:()Ljava/lang/Object;
21: invokespecial #20; //Method scala/Tuple2."<init>":(Ljava/lang/Object;Ljava/lang/Object;)V
24: astore_1
25: aload_1
26: invokevirtual #39; //Method scala/Tuple2._1$mcI$sp:()I
29: istore_3
30: aload_1
31: invokevirtual #35; //Method scala/Tuple2._2:()Ljava/lang/Object;
34: checkcast #41; //class java/lang/String
37: astore 4
Es esto porque el compilador no está comprobando que foo()
s valor de retorno no es un par de valores?
¿La JVM optimizará la construcción de todos modos?
el valor de retorno de 'foo' es una tupla. ¿Por qué crees que no es así? –
foo devuelve un tipo, pero en 9: en barra() construye una nueva tupla. –