我有一个serde-annotated结构树,它成功解析了示例XML,包括这个片段:
<bmsg>
<cmsg>
<!-- ... -->
<cmsg>
<bmsg>
Run Code Online (Sandbox Code Playgroud)
现在我正在使用大型示例XML文件进行测试,并且以下结构会失败,因为有时<cmsg>..</cmsg>
会丢失.我使用以下方法对此进行反序列化:
#[derive(Serialize,Deserialize, Debug)]
struct A {
#[serde(rename="bmsg")]
messages: B, // <====
}
#[derive(Serialize,Deserialize, Debug)]
struct B { // bmsg
#[serde(rename="cmsg")]
list: Vec<C>,
}
Run Code Online (Sandbox Code Playgroud)
这导致第二个结构中出错:
panicked at 'called `Result::unwrap()` on an `Err` value: missing field `cmsg`
Run Code Online (Sandbox Code Playgroud)
我改变了第一个结构,Vec<>
因此它可以处理一个可选元素:
#[derive(Serialize,Deserialize, Debug)]
struct A {
#[serde(rename="bmsg")]
messages: Vec<B>, // <====
}
#[derive(Serialize,Deserialize, Debug)]
struct B { // bmsg
#[serde(rename="cmsg")]
list: Vec<C>,
}
Run Code Online (Sandbox Code Playgroud)
但是,塞尔德继续给出同样的错误.我也试过Option<>
,但没有到达任何地方.
最令我困惑的是,我Vec<>
到处都使用,从不遇到这个问题.
我期待有一种Vec::insert_slice(index, slice)
方法— String::insert_str()
确实存在字符串()的解决方案。
我知道Vec::insert()
,但是一次只插入一个元素,而不是切片。或者,当前置切片为一个切片时,Vec
可以附加一个切片,但这不能一概而论。惯用的解决方案可能使用Vec::splice()
,但如示例中那样使用迭代器会让我抓狂。
其次,似乎从文档中排除了前置的整个概念。没有任何提及。我会很感激关于原因的评论。注意,Vec::swap_remove()
确实存在相对模糊的方法。
我的典型用例由索引字节字符串组成。
我有这个代码:
if(typeof x == 'object')
return "{"+Object.keys(x)+"}";
Run Code Online (Sandbox Code Playgroud)
它导致(Chrome):
Uncaught TypeError: Object.keys called on non-object
Run Code Online (Sandbox Code Playgroud)
谁能告诉我这里发生了什么?顺便说一下:Firefox也是如此.
ps:不知道对象是什么.Firefox调试失败了我.
通常一个人要打印一个字节为2个十六进制数字,例如10
应该给0x0a
。在Rust中,可能会使用println!("{:#02x}", 10)
,但是它给出了0xa
。
我尝试过的事情列表(使用std::fmt
和中的信息fmt::LowerHex
以及一些StackOverflow问题):
println!("{:#02x}", 10);
println!("{:#0x}", 10);
println!("{:#x}", 10);
println!("{:#x?}", 10);
println!("{:#0x?}", 10);
println!("{:#02x?}", 10);
Run Code Online (Sandbox Code Playgroud)
全部输出0xa
,而不是期望的行为0x0A
。
该问题已被编辑(消除了相关的情绪),随后被标记为其他问题的重复。但是其他答案不能解决为什么上面的列表不起作用。在#
意想不到的输出(格式选项的结果0xa
),尤其是02
,出人意料的是,已经完全没有作用!没有其他问题对此#
特别关注。