我有一个图表,每个顶点连接到6个邻居.在构建图形并进行连接声明时,我想使用如下语法:
1. val vertex1, vertex2 = new Vertex
2. val index = 3 // a number between 0 and 5
3. vertex1 + index = vertex2
Run Code Online (Sandbox Code Playgroud)
结果应该是vertex2被宣告分配为index的个邻居vertex1,相当于:
4. vertex1.neighbors(index) = vertex2
Run Code Online (Sandbox Code Playgroud)
在执行时擦拭Vertex.+,我想出了以下内容:
5. def +(idx: Int) = neighbors(idx)
Run Code Online (Sandbox Code Playgroud)
实际上,非常令人惊讶的是,我的IDE(IntelliJIdea,BTW)没有使第3行加下划线.但是,编译第3行offsprang以下消息:
error: missing arguments for method + in class Vertex;
follow this method with `_' if you want to treat it as a partially applied function
Run Code Online (Sandbox Code Playgroud)
接下来,我尝试使用一个提取器,但实际上,这似乎并不适合这种情况.
如果我想要达到的目标是否可行,是否有人有任何线索?
谢谢
你可能可以通过使用:=代替而实现你想要的=.看看这个说明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
Run Code Online (Sandbox Code Playgroud)
正如其中一条评论所述,自定义=需要两个参数,例如vertex1(i)=vertex2,vertext.update(i,vertex2)因此禁止使用您提出的确切语法.另一方面:=是一个常规的自定义操作员,a:=b并将dessugar a.:=(b).
现在我们还有一个考虑要做.优先级是否按照您的意图运行?根据语言规范第6.12.3节,答案是肯定的.+优先级高于:=,因此它最终起作用(a+b):=c.