私は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)) {
だから私の質問は、再びですエラー?
私の元の考えはおそらく私が何かを過負荷にしていたということでした...しかしrec
はcase clase ... extends QuadTree
のすべてで常にRectangle
です。だから私は何かを過負荷にしているとは思わない?
'QuadTree'型でなければならないので、' Node's、 'Leaf's、' Empty'sを処理できるようにする必要があります。あなたは、そうでなければそれはQuadTreeにもなければならないと言うとき、正確にはどういう意味ですか?私は 'case class Rectanlges(*/some params/*)extends QuadTree'に変更しようとしましたが、これはエラーを防ぐものではありません。 – SnarkShark
SnarkShark、私の編集で上記の解決策を参照してください –
このソリューションは機能しますが、何が起こっているのか正確にはわかりません。あなたは何をやっているのか気になりますか?私は、特にノード、リーフ、エンプティと一致させようとすると、オーバーライド・ヴァルが後で問題を引き起こすと心配しています。オーバーライドの例はオーバーライドvalですか?私はまた、ドキュメントをチェックします。ありがとうございました! – SnarkShark