Perché questo codice Scala:Perché Scala costruisce una nuova tupla quando spacchetta una tupla?
class Test
{
def foo: (Int, String) =
{
(123, "123")
}
def bar: Unit =
{
val (i, s) = foo
}
}
generare i seguenti bytecode per bar()
che costruisce una nuova Tuple2
, passa il Tuple2
da foo()
ad esso e poi ottiene i valori fuori di esso?
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
È questo perché il compilatore non sta controllando che foo()
s valore di ritorno non è una tupla?
La JVM ottimizzerà comunque la costruzione?
Il valore di ritorno di 'pippo' è una tupla. Perché pensi che non lo sia? –
foo restituisce un tipo, ma a 9: in bar() costruisce una nuova tupla. –