次のようにタプルを割り当てることができます。
var (min, max) = (1, 2)
しかし、次のように再割り当てすることはできません
(min, max) = (1, 3) //compiler error: ';' expected but '=' found
代わりに、私はしなければならないようです:
min = 1
max = 3
なぜ後者は機能するのに前者は機能しないのですか?
まあ、そういう仕様だったからだと思います。
このタプル割り当ては、パターン マッチングの例です。パターン マッチングは、次の 3 つの場所で行われます。
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
。その例では と は同じではn
なく、少し前に定義されていることに注意してください。パターン マッチは、新しい識別子およびに値を割り当てます。これにより、ステートメントの escope の以前の定義が隠蔽されます。この例でも同じことが起こりましたが、これは変更されておらず、以前に定義されていました。c
n
c
n
c
case
for
n
c
ここで、新しい識別子に新しい値を割り当てるのではなく、以前の値を上書きする必要があります。これはパターン マッチングの仕組みではありません。つまり、それを実現するには、まったく新しいルールが必要になります。Scala は人々に不変性をやさしく促しているので、これを処理するためだけに新しいルールを作らなかったのも無理はないと思います。