28

次のようにタプルを割り当てることができます。

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

しかし、次のように再割り当てすることはできません

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

代わりに、私はしなければならないようです:

min = 1
max = 3

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

4

1 に答える 1

28

まあ、そういう仕様だったからだと思います。

このタプル割り当ては、パターン マッチングの例です。パターン マッチングは、次の 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 の以前の定義が隠蔽されます。この例でも同じことが起こりましたが、これは変更されておらず、以前に定義されていました。cncnccasefornc

ここで、新しい識別子に新しい値を割り当てるのではなく、以前の値を上書きする必要があります。これはパターン マッチングの仕組みではありません。つまり、それを実現するには、まったく新しいルールが必要になります。Scala は人々に不変性をやさしく促しているので、これを処理するためだけに新しいルールを作らなかったのも無理はないと思います。

于 2009-10-26T15:59:50.570 に答える