次のコードがあります:
val text = "some text goes here"
val (first, rest) = text.splitAt(4)
println(first + " *" + rest)
それはうまくいきます。
ただし、次のように、外部で「first」と「rest」を定義する 2 つのケースを用意します。
val text = "some text goes here"
var (first, rest) = ("", "")
if (text.contains("z")) {
(first, rest) = text.splitAt(4)
} else {
(first, rest) = text.splitAt(7)
}
println(first + " *" + rest)
しかし、エラーが発生します:
scala> | <console>:2: error: ';' expected but '=' found.
(first, rest) = text.splitAt(4)
(first, rest) = text.splitAt(4) とするとエラーになるのに、val (first, rest) = text.splitAt(4) とするとエラーにならないのはなぜですか? また、どうすればよいですか?
編集: val を再割り当てできません。var に変更しました。同じエラーです
ベストアンサー1
Serjの回答では、これを書くためのより良い方法が示されていますが、2番目のバージョンが機能しない理由についての質問への回答については、Scala仕様、これは次のことを区別します変数定義そして課題。
「4.2 変数の宣言と定義」より:
変数定義は、パターン (§8.1) を左側に持つこともできます。 が単純な名前または名前の後にコロンと型が続くパターン以外の場合の変数
var p = e
定義は、値定義 と同じ方法 (§4.1) で展開されますが、 の自由名は値ではなく変更可能な変数として導入される点が異なります。p
val p = e
p
「6.15 割り当て」より:
単純な変数への代入の解釈は
x = e
の定義に依存しますx
。 がx
可変変数を表す場合、代入によって の現在の値がx
式 の評価結果に変更されますe
。
(first, rest)
ここでは単純な変数ではなくパターンなので、変数定義では機能しますが、割り当てでは機能しません。