我正在尝试使用 Rust 中的 Serde 和 Quick-XML 反序列化 MathML。由于 MathML 的递归性质,我在尝试编写结构时遇到了麻烦。这是一个最小的、可重现的示例:
use quick_xml;
use serde::Deserialize;
#[derive(Debug, Deserialize)]
#[serde(rename = "math", rename_all = "camelCase")]
pub enum MathNode {
Apply(Vec<MathNode>),
Ci(Vec<MathNode>),
Text(String),
#[serde(rename = "math")]
Root(Vec<MathNode>),
}
pub fn parse(doc: &str) -> Result<MathNode, quick_xml::DeError> {
let raw_model = quick_xml::de::from_str(doc);
raw_model
}
pub fn main() {
let test = "<math>
<apply>
<ci type=\"integer\">5</ci>
</apply>
</math>";
let parsed = parse(test);
println!("{:?}", parsed);
}
Run Code Online (Sandbox Code Playgroud)
来自脚本语言背景和一些C,试图"学习"Rust让我质疑我的能力.我正在试图找出如何更改自有指针,并努力做到这一点.
除了从额外的lib中复制之外,我无法弄清楚我在二叉树上需要的递归.特别是,我不知道如何换出指针分支.虽然使用链表我可以作弊并使用临时向量来返回一个新列表,或者在列表头前添加一个新的Cons(值,~Cons),但是分支让我感到困惑.
enum NaiveTreeNode {
NNil,
NNode(~NaiveTreeNode, ~NaiveTreeNode, int, char)
// left right key val
}
impl NaiveTreeNode {
fn eq(first_node: &NaiveTreeNode, second_node: &NaiveTreeNode) -> bool {
match (first_node, second_node) {
(&NNil, &NNil) => true,
( &NNode( ~ref left_lval, ~ref left_rval, left_leafkey, left_leafval ),
&NNode( ~ref right_lval, ~ref right_rval, right_leafkey, right_leafval )
) if left_leafkey == right_leafkey && left_leafval == right_leafval => {
NaiveTreeNode::eq(left_lval, right_lval) && NaiveTreeNode::eq(left_rval, right_rval)
},
_ => false
}
}
fn add_branch(&mut self, node_to_add: ~NaiveTreeNode) { …Run Code Online (Sandbox Code Playgroud)