2017-06-07 5 views
0

私はQuadTreeを検索するためのScalaコードを書いています。私はScalaの新機能ですので、これは簡単な質問かもしれません:tree.recを関数に使用しようとすると、error: value rec not a member of QuadTreeが得られますが、REPLにtree.recを評価すると、データが正常に返されますか?私のvalを関数で使用するとエラーが発生しますが、REPLでそれ自身のvalにアクセスするとエラーになりません。

とにかく、私は開始するには、これらのクラスを持っている:

case class Rectangle (minx: Int, maxx: Int, miny: Int, maxy: Int) 

abstract class QuadTree 
case class Node (value : Int, nw : QuadTree, ne: QuadTree, sw: QuadTree, se: QuadTree, rec: Rectangle) extends QuadTree 
case class Leaf (value : Int, rec: Rectangle) extends QuadTree 
case class Empty (value: Int, rec: Rectangle) extends QuadTree 

だから私は矩形を定義し、その後することができますが値を持っており、いずれかのノードが含まれている、葉四分木、よ、または空です。

次に、2つの入力矩形が重複する場合はを返し、重複がない場合はFalseを返します。rectangles_Overlapという2つの矩形が重複しているかどうかを確認する関数があります。

私は木のサイズを取得したい場合は、私はREPL

scala> tree1.rec 
res0: Rectangle = Rectangle(1,16,1,16) 

に入力できる

val query = Rectangle(1, 8, 8, 16) 
val tree1 = Node(13,Node(12,Leaf(7,Rectangle(1,4,12,16)),Leaf(3,Rectangle(4,8,12,16)),Leaf(2,Rectangle(1,4,8,12)),Empty(0,Rectangle(4,8,8,12)),Rectangle(1,8,8,16)),Empty(0,Rectangle(8,16,8,16)),Empty(0,Rectangle(1,8,1,8)),Leaf(1,Rectangle(8,16,1,8)),Rectangle(1,16,1,16)) 

を定義した場合、私はまた、クエリかどうかを確認するために私のrectangles_Overlapメソッドを使用することができます長方形はツリーの長方形と重なっています。

scala> rectangles_Overlap(query, tree1.rec) 
res1: Boolean = true 

しかし、私は別の関数でrectangles_Overlap(query, tree1.rec)を使用しようとすると、その不幸!その後、

def queryBoolean(query: Rectangle, tree: QuadTree): Boolean = { 
    if(rectangles_Overlap(query, tree.rec)) { 
     println("Yay they overlap so I can do other stuff...") 
     // I want to add other code here after I get this working 
     true 
    } else { 
     println("Nah, they don't overlap, don't need to do anything") 
     false 
    } 
} 

そしてqueryBoolean(query, tree1)で関数を呼び出す、私はこのエラーを取得:なぜ私はREPLでtree1.recを評価することができますが、なし機能でtree.recを使用することはできません。

<console>:17: error: value rec is not a member of QuadTree 
     if (rectangles_Overlap(query, tree.rec)) { 

だから私の質問は、再びですエラー?

私の元の考えはおそらく私が何かを過負荷にしていたということでした...しかしreccase clase ... extends QuadTreeのすべてで常にRectangleです。だから私は何かを過負荷にしているとは思わない?

答えて

2

これは本当です。すなわち、Rectangleのタイプは、ではなく、 QuadTreeのメンバーです。 QuadTreeからNodeに変更すると動作します。それ以外の場合はQuadTreeにも存在する必要があります。

def queryBoolean(query: Rectangle, tree: Node): Boolean 

のval(valのがそれにアクセスするために必要とされる)として四分木に追加し、あなたは以下のようにスーパーコンストラクタをオーバーライドして呼び出す必要があります:

abstract class QuadTree(val rec: Rectangle) 
    case class Node (value : Int, nw : QuadTree, ne: QuadTree, sw: QuadTree, se: QuadTree, override val rec: Rectangle) extends QuadTree(rec) 
    case class Leaf (value : Int, override val rec: Rectangle) extends QuadTree(rec) 
    case class Empty (value: Int, override val rec: Rectangle) extends QuadTree(rec) 
+0

'QuadTree'型でなければならないので、' Node's、 'Leaf's、' Empty'sを処理できるようにする必要があります。あなたは、そうでなければそれはQuadTreeにもなければならないと言うとき、正確にはどういう意味ですか?私は 'case class Rectanlges(*/some params/*)extends QuadTree'に変更しようとしましたが、これはエラーを防ぐものではありません。 – SnarkShark

+0

SnarkShark、私の編集で上記の解決策を参照してください –

+0

このソリューションは機能しますが、何が起こっているのか正確にはわかりません。あなたは何をやっているのか気になりますか?私は、特にノード、リーフ、エンプティと一致させようとすると、オーバーライド・ヴァルが後で問題を引き起こすと心配しています。オーバーライドの例はオーバーライドvalですか?私はまた、ドキュメントをチェックします。ありがとうございました! – SnarkShark

1

QuadTreeではrecは定義されていませんが、そのサブクラスに対してのみ定義されているため、呼び出す値はありません。これがREPL上で正しく動作する理由は、それが定義されているからです。あなたは

val tree1 = Node(/*some params*/) 
それは Node型を持つ意味

、代わりのQuadTreeとして定義します。 Nodeにはrecというパラメータが定義されているため、すべて正常に動作します。ただし、このメソッドでは、生のQuadTreeを渡すので、recは定義されません。

recQuadTreeクラスに追加するか、または適切なパラメータが定義されている特定のサブタイプを渡します。

+0

Node'は 'QuadTree'、wouldnを拡張'ので、 't 'tree1'はNodeとQuadTreeの両方になりますか?おそらく私はあなたが「QuadTreeにrecを追加する」ということを誤解していますが、Rectangleクラスを 'case class Rectangle(*/some params/*)extends QuadTree'に変更しました。 QuadTreeのメンバーではありません。このような初心者であることをお詫びしますが、「QuadTreeクラスにrecを追加する」ということをもっと説明できますか?私はまた、 "特定のサブタイプに合格"が何を意味するのかもわかりません。ご協力いただきありがとうございます! – SnarkShark

関連する問題