5

Scala XML Elem オブジェクトと XML 要素の別の表現 (私の場合は dom4j Element) との間で暗黙的に変換したいと考えています。私は次の暗黙の変換を書きました:

implicit def elemToElement(e: Elem): Element = ... do conversion here ...
implicit def elementToElem(e: Element): Elem = ... do conversion here ...

これまでのところ、これはうまくいきます。

ここで、両方の方法を変換するために、上記の要素のコレクションも必要です。まず、追加の変換メソッドを書く必要は絶対にあるのでしょうか? そうしないと、物事はうまくいかないようでした。

私は次のように書いてみました:

implicit def elemTToElementT(t: Traversable[Elem]) = t map (elemToElement(_))
implicit def elementTToElemT(t: Traversable[Element]) = t map (elementToElem(_))

変換メソッドが Traversable を受け取る場合、Traversable も返すため、これはあまり理想的ではありません。List を渡すと、Traversable も出力されます。したがって、変換は何らかの方法でパラメータ化する必要があると思います。

では、これらの変換を可能な限り汎用的に記述する標準的な方法は何ですか?

4

2 に答える 2

2

これは自明ではないので、あなたが望むものを得るためには、もう少し深くする必要があると思います. この記事では、scala コレクションがどのように機能するかについて多くのことを説明しています (それも興味深いものです): http://www.artima.com/scalazine/articles/scala_collections_architecture.html

あなたは基本的に List.map(...) (または実装を持つ TraversableLike) と同様のメソッドと同じことをしようとしています....さらに暗黙的な変換のみを行います。

アップデート:

私はこれを少し試してみて、TraversableLike.map(...) の機能に基づいて変換を作成しました。しかし、それがなくても機能することがわかりました。Scalaはすぐにサポートしているようです(少なくとも私のマシンでは:-)):

case class Element(e: Elem)
implicit def elemToElement(e: Elem): Element = Element(e)
implicit def elementToElem(e: Element): Elem = e.e

val a: List[Element] = List(<a/>, <b/>, <c/>)
val b: List[Elem] = List(Element(<a/>), Element(<b/>), Element(<c/>))
val c: Set[Element] = Set(<a/>, <b/>, <c/>)

これはあなたが求めていたものですか?

于 2011-01-13T08:25:20.933 に答える
1

これはインプリシットを取りすぎている可能性があると思います。特にマップでコンバーターメソッドを使用できるため

val listOfElements = listOfElems map elemToElement(_)

あなたが目指しているレベルの簡潔さは難読化されていると思います。混乱を避けるために、変換レイヤーを作成し、表現の 1 つだけで作業します。

于 2011-01-13T01:44:06.127 に答える