0

Scala を使用すると、次のコードが得られます。

def insertRefIntoXml(ref: Int, entry: Node): Node = entry match {
    case <root>{ mainRoot @ _* }</root> 
        => <root>{ mainRoot.map(insertRefIntoXml ref  )}</root>
    case <here>{ contents }</here> => <here>{ ref }</here>
    case other @ _ => other

}

私がやりたいことは、here要素に到達するまで「ref」値を下に渡し続け、それを交換することです.

これはうまくいきません。どうする?

元の質問については、このリンクを確認してください

4

2 に答える 2

0

これがうまくいくかどうかを確認してください:

object TestXml {
  def main(args: Array[String]) {
    val xml = 
      <root>        
    <here>
      <dealID>foo</dealID>
    </here>        
  </root>

    println(insertRefIntoXml(2, xml))
  }

  def insertRefIntoXml(ref: Int, entry: Node): Node = {    
    def doInsertRef(n:Node):Node = {    
      n match {
        case <root>{ mainRoot @ _* }</root> => <root>{ mainRoot.map(doInsertRef)}</root>
        case <here><dealID>{ contents }</dealID></here> => <here><dealID>{ ref }</dealID></here>
        case other @ _ => other
      }       
    }
    doInsertRef(scala.xml.Utility.trim(entry))
  }
}

いくつかの問題がありました。まず、insertRefIntoXmlの呼び出しでmap希望どおりに使用するには、2 つではなく 1 つの引数のみが必要です。これを修正するために、ローカル関数 def を作成しref、そこからクロージャーを介して値を取得しました。代わりに、この問題を次のように解決することもできます。

  def insertRefIntoXml(ref: Int, entry: Node): Node = {       
    entry match {
      case <root>{ mainRoot @ _* }</root> => <root>{ mainRoot.map(insertRefIntoXml(ref, _))}</root>
      case <here><dealID>{ contents }</dealID></here> => <here><dealID>{ ref }</dealID></here>
      case other @ _ => other
    }       
  }

そして、次のように呼び出します。

insertRefIntoXml(2, scala.xml.Utility.trim(xml))

それが私を2番目の問題に導きます。match ステートメントが正しく一致するようにトリミングしています。コードを実行すると、希望する出力が得られると思います。

于 2013-07-18T13:28:13.863 に答える