2009-10-26 6 views
25

次のように私はタプルを割り当てることができます。タプルパラメータ宣言と代入風変わり

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

をしかし

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

は、代わりに私がしなければならないように見える次のように私はしませんその後、を再割り当てることができます。

min = 1 
max = 3 

前者はなぜ機能しないのですか?

答えて

26

まあ、それはそのようにspec'edされているので、私は思います。

これは、タプルの割り当てで、パターンマッチングの例です。最後の例、caseを使用して1を取り、今

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) 
} 

var PATTERN = ... // or val 

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

case PATTERN => ... 

だから、すべてのこれらのケースは仕事:パターンマッチングは私がリコール3ヶ所で行われます。その例における nおよび cは、 ではなく、であり、同じ nおよび cが少し前に定義されていることに注意してください。パターンマッチでは、 caseステートメントのエスケープの以前の定義を影にして、 という新しい値を識別子 ncに割り当てます。 forの例でも同じことが起こりましたが、これは前に定義した ncを変更しませんでした。

ここで、新しい識別子に新しい値を割り当てる代わりに、以前の値を上書きすることができます。これはパターンマッチングの仕組みではなく、まったく新しいルールを伴います。 Scalaは静かに人を不変性に向かわせるので、これを処理するだけの新しいルールを作成していないのは不合理ではないと思います。

+1

チケットはhttps://issues.scala-lang.org/browse/SI-1324です(「SIPが必要です」) –

関連する問題