1

我有一个图,每个顶点连接到 6 个邻居。在构建图形并声明连接时,我想使用如下语法:

1.    val vertex1, vertex2 = new Vertex
2.    val index = 3    // a number between 0 and 5
3.    vertex1 + index = vertex2

结果应该是vertex2声明为 的index-th 邻居vertex1,相当于:

4.    vertex1.neighbors(index) = vertex2

在 frobbing 的实现时Vertex.+,我想出了以下内容:

5.    def +(idx: Int) = neighbors(idx)

令人惊讶的是,这并没有导致我的 IDE(IntelliJIdea,BTW)在第 3 行下划线。但是,第 3 行的编译衍生出以下消息:

error: missing arguments for method + in class Vertex;
follow this method with `_' if you want to treat it as a partially applied function

接下来,我尝试使用提取器,但实际上,这似乎不太适合这种情况。

如果我想要实现的目标是否可行,有人知道吗?

谢谢

4

2 回答 2

7

您可能可以通过使用:=而不是=. 看看这个说明性的 repl 会话:

scala> class X { def +(x:X) = x; def :=(x:X) = x }
defined class X

scala> val a = new X;
a: X = X@7d283b68

scala> val b = new X;
b: X = X@44a06d88

scala> val c = new X;
c: X = X@fb88599

scala> a + b := c
res8: X = X@fb88599

正如评论之一所述,自定义=需要两个参数,例如vertex1(i)=vertex2被取消以vertext.update(i,vertex2)禁止您提出的确切语法。另一方面:=是一个常规的自定义操作符,a:=b会去糖化到a.:=(b).

现在我们还有一个考虑要做。优先级会按您的意图工作吗?根据语言规范第 6.12.3 节,答案是肯定的。+具有比 更高的优先级:=,因此它最终以(a+b):=c.

于 2012-09-04T03:53:13.963 回答
1

不完全是你想要的,只是玩右关联:

scala> class Vertex {
     |   val neighbors = new Array[Vertex](6)
     |   def :=< (n: Int) = (this, n)
     |   def >=: (conn: (Vertex, Int)) {
     |     val (that, n) = conn
     |     that.neighbors(n) = this
     |     this.neighbors((n+3)%6) = that
     |   }
     | }
defined class Vertex

scala> val a, b, c, d = new Vertex
a: Vertex = Vertex@c42aea
b: Vertex = Vertex@dd9f68
c: Vertex = Vertex@ca0c9
d: Vertex = Vertex@10fed2c

scala> a :=<0>=: b ; a :=<1>=: c ; d :=<5>=: a

scala> a.neighbors
res25: Array[Vertex] = Array(Vertex@dd9f68, Vertex@ca0c9, Vertex@10fed2c, null, null, null)
于 2012-09-04T07:10:04.987 回答