2011-01-06 8 views
0

http://steve-yegge.blogspot.com/2008/10/universal-design-pattern.htmlの後に "連鎖マップ"を定義しようとしています。コンパニオンオブジェクトapplyメソッドを定義する問題が発生しました。ここで私が出ているものです:ScalaでChainedMapを定義する

import scala.collection.generic.ImmutableMapFactory 
import scala.collection.immutable.HashMap 

class ChainedMap[A, B](private val superMap: ChainedMap[A, B]) 
    extends HashMap[A, B] { 
    override def get(key: A): Option[B] = { 
    if (contains(key)) { 
     get(key) 
    } else if (superMap != null) { 
     superMap.get(key) 
    } else { 
     None 
    } 
    } 
} 

object ChainedMap extends ImmutableMapFactory[ChainedMap] { 
    override def apply[A, B](superMap: ChainedMap[A, B], 
          elems: (A, B)*): ChainedMap[A, B] = { 
    // What goes here? 
    } 
} 

ここで私はそれを使用する方法である。

val parentMap = ChainedMap(null, "x" -> 1, "y" -> 2) 
val childMap = ChainedMap(parentMap, "a" -> 42) 
+0

はどのようにあなたが唯一のコンストラクタは、引数として 'ChainedMap'を取り、それは不変の空のハッシュマップのコンストラクタを呼び出す場合、何かが含まれている' ChainedMap'を作成するのですか? –

+1

私は、不変のHashMapsから 'ChainedMap'クラスを作成する際に実際にその点を見ていません。 'val parentMap = Map(" x " - > 1、" y " - > 2)'を作成して、すでに組み込まれているサポートを使って 'val childMap = parentMap ++(" a " - > 42) Scalaコレクションライブラリ –

+0

@Ken Bloom:Duh!私はそれを考えなかった。同じ鍵が子供と親の両方に現れたら、子供が最初に見つかるでしょう。私はおそらく質問を削除し、自分自身の恥ずかしさを保存する必要があります。 – Ralph

答えて

4

まあ、Scalaのコレクションを拡張することは難しいです。 this referenceに加え、いくつかのブログとスタックオーバーフローに関する質問があります。ただし、既にサポートされているため、実行する必要はありません。

scala> val parentMap = Map("x" -> 1, "y" -> 2)    
parentMap: scala.collection.immutable.Map[java.lang.String,Int] = Map((x,1), (y,2)) 

scala> val childMap = Map("a" -> 42) withDefault parentMap 
childMap: scala.collection.immutable.Map[java.lang.String,Int] = Map((a,42)) 

scala> childMap("x") 
res5: Int = 1 
+0

それは甘いです!上記のKen Bloomのコメントもご覧ください。私はそれについて考えませんでしたが、不変のデータ構造は、 "更新"されたときに元の構造と値を "共有"します。 Clojureでも動作します。 – Ralph

+0

@Ralph本当に十分です。 –

+0

ダニエルの答えは、変更可能なマップで動作します(親を更新すると子に反映されます)が、++では新しいマップが作成されるため、私の答えは反映されません。不変のマップ)。また、反復は異なります。 –

関連する問題