2016-02-22 49 views
0

認爲這通過間接索引獲取匿名/未命名的元組值?

val oddOrEven = (odd, even) 

oddOrEven._1會給「奇」,而oddOrEven._2會給「甚至」

我們基本上得到了「無名」的成員一個元組,如果你願意這樣。

但是讓我們假設我想獲得奇數或偶數,這取決於一些外部數據,就像這樣:

val witness: Int = {numberOfPrevious % 2} 
現在

,讓我們做到這一點:

val one = oddOrEven._witness 

這不會編譯。

是否存在一些特殊的語法或者這是不可能的?

我很好奇,想知道是不是編譯器不能推斷出witness的唯一可能值是0和1(但我認爲愚蠢的在我身邊,但我不得不嘗試)並嘗試這樣的:

val oddOrEven = (odd, even) 
val witness: Int = {numberOfPrevs % 2} 

val v = x match { 
    case 0 => oddOrEven._1 
    case 1 => oddOrEven._2 
} 

又一次val one = oddOrEven._witness是行不通的

然後我進一步挖掘,發現,的確是編譯器不會檢查疲憊。像:

val v = x match { 
    case 1 => oddOrEven._1 
    case 2 => oddOrEven._2 
} 

仍然會編譯,雖然2不可能和0失蹤!

所以,我知道我在這裏混合的東西。我知道有沒有被所謂的在我的母語「筋疲力盡」的比賽,所以可能的值不會在編譯時推斷,但在運行時(實際上,我會得到一個

scala.MatchError: 0 (of class java.lang.Integer) at runtime.

但,但我真正感興趣的:由「間接指標」我能「無名」的元組像我的意思是

+0

不,不是像斯卡拉這樣的靜態類型語言。 – Haspemulator

回答

1

約保持它的簡單,這樣的內容:

val oddOrEven = (odd, even) 
val witness: Int = {numberOfPrevious % 2} // Or any other calculation of index 
oddOrEven.productElement(witness) 

你鬆散型的安全性,同時productElement返回所有,但是當你知道會員的類型,你可以投,如:

oddOrEven.productElement(witness).asInstanceOf[YourType] 

我在這裏假設你的奇數和偶數值是同一類型的,例如:

sealed trait OddOrEven 
case object odd extends OddOrEven 
case object event extends OddOrEven 

然後:

oddOrEven.productElement(witness).asInstanceOf[OddOrEven] 

會給你正確的類型OddOrEven。

Btw。看一看ScalaDoc for Tuple2

1

你或許應該這樣做,如果你需要一個指數,想想List或。 Vector

但是,如果你真的想要這個和你所有的元組都是相同類型的(例如Int),你可以這樣做:

(even, odd).productIterator.collect { case x: Int => 2* x }.toList(0) 
1

嗯,你可以這樣做tuple.productIterator.toList(index-1),但如果你想有一個列表,它可能是一個更好的主意,只是用一個列表,而不是一個元組轉換到它。

不,編譯器不會試圖找出你的代碼可以執行的所有可能的方式,以便告訴變量可能取值的可能值。