2009-10-26 22 views
25

如下我可以指定一個元組:元組參數聲明和分配古怪

var (min, max) = (1, 2) 

但我不能那麼重新分配如下

(min, max) = (1, 3) //compiler error: ';' expected but '=' found 

相反,我似乎有做:

min = 1 
max = 3 

爲什麼後者工作,而前者不是?

回答

26

好吧,因爲它是這樣指定的,我想。

這是元組賦值,是模式匹配的一個例子。

var PATTERN = ... // or val 

for (PATTERN <- ...) ... 

case PATTERN => ... 

所以,所有這些情況下工作:模式匹配,我記得三個地發生

val l = List((1,'a'), (2,'b'), (3,'c')) 
var (n, c) = l(0) 
for ((n, c) <- l) println(n+": "+c) 
l(1) match { 
    case (n, c) => println(n+": "+c) 
} 

現在,取最後一個例子,使用case之一。請注意,該示例中的nc而不是與之前定義的nc相同。模式匹配將爲新的標識符nc分配值,這將影響前面定義的case語句的範圍。 for示例中發生的情況也是如此,前面定義的nc未發生變化。

現在,你想要發生的是覆蓋以前的值,而不是分配新的值到新的標識符。這不是模式匹配的工作方式,這意味着要實現它將需要一個全新的規則。既然斯卡拉輕輕地刺激人們走向不變,我想這不是不合理的,他們並沒有制定新的規則來處理這個問題。

+1

門票是https://issues.scala-lang.org/browse/SI-1324(「它需要一個SIP」) –