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

可能编译器的信息有些误导。关键是它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

因此编译器将解释以下内容,就好像您将两个参数传递给 "+=" 函数,而不是传递一个元组给它。

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 回答