क्यों इस स्काला कोड है:स्काला टुपल को अनपॅक करते समय एक नया ट्यूपल क्यों बनाता है?
class Test
{
def foo: (Int, String) =
{
(123, "123")
}
def bar: Unit =
{
val (i, s) = foo
}
}
bar()
है कि एक नए Tuple2
निर्माण के लिए निम्नलिखित बाईटकोड उत्पन्न करते हैं, यह करने के लिए foo()
से Tuple2
गुजरता है और फिर उससे बाहर मूल्यों हो जाता है?
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
इस वजह संकलक जाँच नहीं कर रहा है कि foo()
रों वापसी मान एक टपल नहीं है है?
क्या JVM निर्माण को किसी भी तरह से अनुकूलित करेगा?
'foo' का वापसी मूल्य _is_ एक tuple। आपको ऐसा क्यों लगता है कि यह नहीं है? –
foo एक प्रकार लौटाता है, लेकिन 9: बार में() यह एक नया ट्यूपल बनाता है। –