1

多くの不明な属性を持つノードの NodeSeq があります。NodeSeq を検証して再作成し、エラーが発生した場合はノードの属性として追加する必要があります。

以下のソリューションは機能しますが、目標を達成するためのよりエレガントな方法があるかどうか疑問に思っていましたか?

def validateErrors (nodes:NodeSeq):NodeSeq={

 var newNodes = new Queue[Node]()
   nodes.foreach ( n => {
     var error:Boolean = false
     var errorMessage:String = ""
     //...do many complex validations
     // and get the error status code and error message
     if (error)
       newNodes += AddError(n,errorMessage)
     else
       newNodes +=n       
   })
   newNodes
}

private def AddError (node:Node, message:String ):Node= node match {  
    case elem : Elem => elem % Attribute(None, "color", Text("red"), Null)  %  Attribute(None, "message", Text(message ), Null) //and many more
    case other => other   
}
4

2 に答える 2

1

役立つかもしれないことの 1 つは、a の代わりに anewNodesとして宣言し、 orの代わりにorを使用して、新しい値を反復処理して構築することです。代わりに使用する他の宣言を変更することも良いでしょう。エラーメッセージに(Jens Schauderの回答で提案されているように)メッセージに使用すると、フラグが不要になります。valvarmapforforeachnodesvarvalOption[String]

val nodes = for (n <- nodes) yield {
  val errorMsg: Option[String] = {
    //...do many complex validations
    // and get the error status code and error message
  }
  errorMsg match {
    case Some(msg) => AddError(n, msg)
    case None => n
  }
}

foldLeft(つまり) を使用して/:すべての属性を追加すると、次のように単純化される場合AddErrorもあります。

private def AddError(node: Node, message: String ): Node = node match {  
  case elem: Elem => {
    val attrs = List("color"->Text("red"), "message"->Text(message) /* , ... */)
    (elem /: attrs) { (acc, x) => acc % Attribute(None, x._1, x._2, Null) }
  }
  case _ => node
}

Attribute フィールドにcase objectのような sを使用することを検討することもできます。enum

Attribute(None, AttColor, "red", Null)
Attribute(None, AttMsg, Text(message), Null)

ケース クラスはさらに優れている可能性があります (ただし、 が複数の方法で使用されている場合は、ケースを追加する必要があるかもしれませんText)。

Attribute(None, Color("red"), Null)
Attribute(None, MsgText(message), Null)
于 2012-08-20T06:13:10.383 に答える
1

フラグの代わりに、errorerrorMessageOption[String]を作成し、エラー メッセージ全体を作成する部分をメソッドにすることができます。

また、 addError メソッドを変更して、パターン マッチングを使用してエラーがない場合も処理することができます。

private def AddError (node:Node, message:Option[String] ):Node= (node, message) match {  
    case (elem : Elem, Some(m) => elem % Attribute(None, "color", Text("red"), Null)  %  Attribute(None, "message", Text(m), Null) //and many more
    case (other,_) => other   
}

注: これは scala コンパイラを使用せずに入力したため、おそらくコンパイルされませんが、アイデアが明確になることを願っています。

于 2012-08-20T05:50:29.843 に答える