错误:类型`& [str]`没有在名为`encode`的作用域中实现任何方法

时间:2014-10-21 11:59:32

标签: json rust

我试图用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的性质?

2 个答案:

答案 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字符串被释放。