我试图用JSON接口编写一些Rust。
我希望以下结构能够自动从JSON编码/解码:
#[deriving(Encodable)]
struct Joined<'a> {
channel: &'a str,
user: &'a str,
users: &'a [str],
}
示例JSON:
{
"channel":"foo",
"user":"bar",
"users":[
"bar",
"baz",
"quux"
]
}
我得到的错误是:
src/chat.rs:28:5: 28:21 error: type `&[str]` does not implement any method in scope named `encode`
src/chat.rs:28 users: &'a [str],
^~~~~~~~~~~~~~~~
src/chat.rs:24:12: 24:21 note: in expansion of #[deriving(Encodable)]
src/chat.rs:28:5: 28:21 note: expansion site
我在Rust中尝试可能,或者我误解了Encodable
的性质?
答案 0 :(得分:3)
&[str]
是一种非常特殊的类型,当它编译时,你可能无法用它做任何事情:大多数字符串操作函数是为&str
实现的,而不是{{1}这是你可能永远不会使用的类型。
你的意思可能是str
,不是吗?
然而,这样的结构永远不可解码。如果您希望如此,则需要拥有其内容,因此使用users: &'a [&'a str]
代替String
和&str
代替Vec<>
,如下所示:
&[]
答案 1 :(得分:1)
我已经回答了,但我不确定它是好的(我是Rust的新手)。
#[deriving(Encodable)]
struct Joined<'a> {
channel: &'a str,
user: &'a str,
users: &'a Vec<&'a str>,
}
...
fn main() {
let users = vec!["bar","baz","quux"];
let joined = Joined{channel:"foo",user:"bar",users:&users};
println!("{}", json::encode(&joined));
...
批评是非常受欢迎的。
这也有效:(根据@Levans回答)
#[deriving(Encodable)]
struct Joined {
channel: String,
user: String,
users: Vec<String>,
}
...
fn main() {
let users = vec!["bar".to_string(),"baz".to_string(),"quux".to_string()];
let joined = Joined{channel:"foo".to_string(),user:"bar".to_string(),users:users};
println!("{}", json::encode(&joined));
...
我认为的区别在于,如果您将源JSON字符串保留在内存中(因为它可以被编入索引),第一个是好的,但第二个做了大量的堆分配(但是让原始的JSON字符串被释放。