2017-06-14 38 views
3
def giveMeTuple: Tuple2[String, String] = { 
    Tuple2("one", "two") 
} 

def testFive: Unit = { 
    val one, two = giveMeTuple 
    println(one) 
    println(two) 
    () 
} 

testFive 

產地:如何收集的元組到單獨的變量

(one,two) 
(one,two) 

但我期待:

one 
two 

這是怎麼回事用onetwo初始化?

回答

3

Alm那裏。 這是你所需要的:

val (one, two) = giveMeTuple 

隨着

val one, two = giveMeTuple 

你說:由giveMeTuple返回的值初始化one和初始化通過giveMeTuple返回two值(在這種情況下giveMeTuple會被調用兩次)

另一個類似的例子是

val one, two = 1 

其中兩個將被初始化爲價值1

而是要通過giveMeTuple解構的價值迴歸,並從元組採取的第一個和第二個值。在這種情況下,giveMeTuple當然只會被調用一次。

+1

感謝您的解釋。這意味着,聲明幾個變量將使用正確的值初始化所有變量?這是否意味着右側將被執行多次,或者返回值將被複制,還是會創建多個對單個值的引用? – dangonfast

+1

是的,例如,如果你做'val one,two = 1',兩者的值都是'1'。 右側將執行多次。 – matteobarbieri

+0

好的。我認爲當使用元組賦值語法'val(one,two)= ...'時,右側將只執行一次,這正是我想要的(右側在我的情況下可能會很貴) – dangonfast

2

你缺少括號:

val (one, two) = giveMeTuple 

如果我們編譯上面的代碼中,我們會看到,這僅僅是一個元組模式是Scalas模式的一部分匹配的特徵:

def main(args: Array[String]): Unit = {                        
    private[this] val x$1: (String, String) = (TupleTest.this.giveMeTuple: (String, String) @unchecked) match { 
    case (_1: String, _2: String)(String, String)((one @ _), (two @ _)) => scala.Tuple2.apply[String, String](one, two)    
    };                                 
    val one: String = x$1._1;                           
    val two: String = x$1._2;                           
() 
}   

雖然你的例子是雙重調用相同的方法並賦值爲新值:

def giveMeTuple: (String, String) = scala.Tuple2.apply[String, String]("one", "two"); 
def main(args: Array[String]): Unit = {            
    val one: (String, String) = TupleTest.this.giveMeTuple;        
    val two: (String, String) = TupleTest.this.giveMeTuple;        
    ()                     
}                      
+0

感謝你能做到。所以反直覺...我來自Python。 – dangonfast

+0

@delavnog我詳細闡述了一下,以說明元組解構在Scala中的實際工作原理 –

0

如下太

def testFive: Unit = { 
    val (one, two) = (giveMeTuple._1, giveMeTuple._2) 
    println(one) 
    println(two) 
() 
}