1

各頂点が6つの隣接頂点に接続されたグラフがあります。グラフを作成し、接続を宣言する際に、次のような構文を使用したいと思います。

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

結果は、次のように、の-番目のネイバーとして割り当てられたvertex2宣言されるはずです。indexvertex1

4.    vertex1.neighbors(index) = vertex2

の実装をいじくり回しているときに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

コメントの1つが述べているように、カスタム=には2つのパラメーターが必要です。たとえば、提案した正確な構文を禁止するために、vertex1(i)=vertex2脱糖されています。vertext.update(i,vertex2)一方:=、通常のカスタムオペレーターであり、a:=bに脱糖しa.:=(b)ます。

今でも、やるべきことが1つあります。優先順位は意図したとおりに機能しますか?言語仕様のセクション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 に答える