10

私は次のようなことができます

def f(): Tuple2[String, Long] = ...
val (a, b) = f()

変数が既に存在する場合はどうなりますか? フィルターを介して同じデータセットを実行していますが、それらをチェーンしたくありません (長い名前など)。これは私が試したものですが、期待について不平を言っています; 最後の行の = の代わりに:

var a = ...initialization for this data
var b = ...some other init
(a, b) = g(a, b) // error: expected ';' but found '='

中間タプルを回避する方法はありますか?

4

5 に答える 5

14

アレックスが指摘したように、短い答えはノーです。コードで何が起こっているかというと、 abが現在のスコープで既にバインドされている変数である場合、(a, b)は「a と b の値を取得し、それらからタプルを構築する」ことを意味します。

したがって、

(a, b) = ...

と同等です

(new Tuple2(a, b)) = ...

これは明らかにあなたが望むものではありません(無意味であることに加えて)。

必要な構文 (一度に複数の変数に代入する機能) は存在しません。一度に複数の既存の変数に同じ値を代入することさえできません(他の多くの言語に見られる通常の構文 "a = b = ..." は Scala では機能しません)。これは偶然ではないと思います。その vals は vars よりも優先的に扱われます。彼らはほとんどの場合、より良いアイデアです。

これはすべて、ある種のループ内で行われ、割り当てが繰り返されているように思えます。これはあまり慣用的な Scala ではありません。プログラムで vars の使用を排除し、map、flatMap、filter、foldLeft などを使用して、より機能的な方法で処理を行うことをお勧めします。

于 2010-07-28T00:55:57.207 に答える
8

簡単な答え: いいえ。

于 2010-07-27T23:32:21.430 に答える
1

その構文は case ステートメントと同様にパターン マッチングとして扱われるため、新しい値に対して機能します。だから、アレックスが言ったように、あなたはそれをすることはできません.

于 2010-07-28T00:31:57.960 に答える
0

フィルターなどで常に「同じデータセット」を実行すると、それらが何らかの形で一緒に属しているという症状になるため、タプルまたは専用クラス (通常はケースクラス) を使用してそれらをグループ化することを検討する必要があります。

于 2010-07-28T06:40:29.593 に答える
0

私が見つけた回避策はこれです:

// declare as var, not val
var x = (1,"hello")  
// x: (Int, String) = (1,hello)

// to access first element
x._1
// res0: Int = 1

// second element
x._2
// res1: String = hello

// now I can re-assign x to something else
x = (2, "world")
// x: (Int, String) = (2,world)

// I can only re-assign into x as long the types match
// the following will fail

x = (3.14, "Hmm Pie")
<console>:8: error: type mismatch;
 found   : Double(3.14)
 required: Int
       x = (3.14, "Hmm Pie")
于 2014-09-21T20:00:10.757 に答える