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