Scala 是否有一种更优雅的方式向节点添加属性?

Scala 是否有一种更优雅的方式向节点添加属性?,scala,Scala,我有很多未知属性的节点。必须验证并重新创建NodeSeq,并将错误(如果遇到)作为属性添加到节点中 下面的解决方案有效,但我想知道是否有更优雅的方式来实现我的目标 def validateErrors (nodes:NodeSeq):NodeSeq={ var newNodes = new Queue[Node]() nodes.foreach ( n => { var error:Boolean = false var errorMessage:String

我有很多未知属性的节点。必须验证并重新创建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   
}

代替
error
标志,您可以将b错误消息设置为
选项[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编译器的情况下键入此文件,因此可能无法编译,但是我希望这个想法变得清晰。

一件可能有帮助的事情是将
newNodes
声明为
val
而不是
var
,并使用
map
for
而不是
foreach
来迭代
节点
并构建新值。将其他
var
声明改为使用
val
也会很好。对错误消息使用
选项[String]
(正如Jens Schauder的回答中所建议的那样)消除了对标志的需要

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
  }
}
您可能还想考虑使用
case对象
s作为属性字段的
enum

Attribute(None, AttColor, "red", Null)
Attribute(None, AttMsg, Text(message), Null)
案例类可能更好(尽管如果
Text
以多种方式使用,您可能需要添加更多案例):


我想您希望默认情况下使用
case\u=>node
,否则情况将返回元组而不是节点。谢谢,我将切换到Option。谢谢!我将尝试将变量转换为VAL,并将该选项用作errorMsg
Attribute(None, AttColor, "red", Null)
Attribute(None, AttMsg, Text(message), Null)
Attribute(None, Color("red"), Null)
Attribute(None, MsgText(message), Null)