3

重複の可能性:
セットへのタプルの追加が機能しない

私はこのコードを持っています:

class A

var buffer = Buffer[(A, Int)]()

次に、どこか:

val a = new A
buffer += (a, 0) // error

型推論器は、私が合格しなければならないときに私が合格したことa(a, 0)伝えることに失敗します:A(A, Int)

scala> def make {
     | val a = new A
     | buffer += (a, 0)
     | }
<console>:11: error: type mismatch;
 found   : A
 required: (A, Int)
       buffer += (a, 0)
              ^

しかし、私がこれを行う場合:

val a = new A
val tuple = (a, 0)
buffer += tuple

エラーはなくなりました。これはある種のバグですか、それとも何かが足りませんか?

4

3 に答える 3

7

コンパイラは、ここでbuffer。+ =(a、0)またはbuffer + = Tuple2(a、0)のどちらを意味するのかを知りません。

可能な解決策:

buffer += Tuple2(a, 0)

buffer += Pair(a, 0) // Pair is an alias for Tuple2

buffer += ((a, 0))

buffer += a -> 0
于 2012-08-17T10:22:14.723 に答える
3

おそらく、コンパイラのメッセージはやや誤解を招くものです。重要なのは、2つのパラメーター関数の呼び出しを見ることができるように、buffer += (a, 0)に脱糖されることです。必要なのは単一のパラメーター関数なので、問題を解決するには、次のようにタプルを余分な中括弧に入れるだけです。buffer.+=(a, 0)+=

 buffer += ((a, 0))

または、次のようなシュガーレッドペア構文を使用します。

 buffer += (a -> 0)
于 2012-08-17T10:22:53.637 に答える
1

+=は最後の関数呼び出しにすぎないことに注意してください。関数「+=」には次のシグネチャがあります。

abstract def +=(elem: A): Buffer.this.type

したがって、コンパイラは、タプルを渡すのではなく、「+=」関数に2つの引数を渡すかのように次のように解釈します。

buffer += (a, 0) // error

解決策は、ネストされた括弧を使用して、タプルを次のように渡すことをコンパイラーに明確にすることです。

scala> buffer += ((new A(), 0))
res2: scala.collection.mutable.Buffer[(A, Int)] = ArrayBuffer((A@16fe464e,0), (A@6774c043,0))
于 2012-08-17T13:39:10.190 に答える