Json 错误:键入`&;[str]`在名为'encode'的作用域中未实现任何方法`

Json 错误:键入`&;[str]`在名为'encode'的作用域中未实现任何方法`,json,rust,Json,Rust,我试图用JSON接口编写一些Rust 我希望以下结构自动从JSON编码/解码: #[deriving(Encodable)] struct Joined<'a> { channel: &'a str, user: &'a str, users: &'a [str], } 我得到的错误是: src/chat.rs:28:5: 28:21 error: type `&[str]` does not implement any me

我试图用JSON接口编写一些Rust

我希望以下结构自动从JSON编码/解码:

#[deriving(Encodable)]
struct Joined<'a> {
    channel: &'a str,
    user: &'a str,
    users: &'a [str],
}
我得到的错误是:

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中尝试的是可能的,还是我误解了可编码的本质?

&[str]
是一种非常特殊的类型,当它编译时,您可能无法对它做任何事情:大多数字符串操作函数都是为
&str
实现的,not
str
这是一种您可能永远不会使用的类型

你的意思可能是
用户:&'a[&'a str]
,不是吗

然而,这样的结构永远不会是可解码的。如果您希望这样,它需要拥有自己的内容,因此使用
String
而不是
&str
Vec
而不是
&[]
,如下所示:

#[deriving(Encodable, Decodable)]
struct Joined {
    channel: String,
    user: String,
    users: Vec<String>,
}
#[派生(可编码,可解码)]
结构连接{
频道:字符串,
用户:字符串,
用户:Vec,,
}

&[str]
是一种非常特殊的类型,当它编译时,您可能无法使用它:大多数字符串操作函数都是为
&str
实现的,而不是
str
,这是一种您可能永远不会使用的类型

你的意思可能是
用户:&'a[&'a str]
,不是吗

然而,这样的结构永远不会是可解码的。如果您希望这样,它需要拥有自己的内容,因此使用
String
而不是
&str
Vec
而不是
&[]
,如下所示:

#[deriving(Encodable, Decodable)]
struct Joined {
    channel: String,
    user: String,
    users: Vec<String>,
}
#[派生(可编码,可解码)]
结构连接{
频道:字符串,
用户:字符串,
用户:Vec,,
}

我已经给出了答案,但我不确定答案是否正确(我是新手)

#[派生(可编码)]

struct Joined我已经给出了答案,但我不确定它是否好(我是新手)

#[派生(可编码)]

struct JoinedI注意,在成员类型中没有使用
&
s。
users
字段是包含向量还是仅包含向量的引用?@chrisdew,是的,这就是重点。此处没有引用(
&
),因此是的,
用户
将包含向量。@VladimirMatveev这是否意味着
连接的
结构不再具有固定大小,因为它现在包含向量的内容?这是一个问题吗?@chrisdew Vec是一个固定大小的类型,它在堆内部处理它的内容。您的
Joined
结构保持固定大小,这没有问题。@chrisdew,没有。该结构包含向量,但不包含其元素。向量本身只有三个指针大小的值长。我注意到在成员类型中没有使用
&
s。
users
字段是包含向量还是仅包含向量的引用?@chrisdew,是的,这就是重点。此处没有引用(
&
),因此是的,
用户
将包含向量。@VladimirMatveev这是否意味着
连接的
结构不再具有固定大小,因为它现在包含向量的内容?这是一个问题吗?@chrisdew Vec是一个固定大小的类型,它在堆内部处理它的内容。您的
Joined
结构保持固定大小,这没有问题。@chrisdew,没有。该结构包含向量,但不包含其元素。向量本身只有三个指针大小的值。实际上,如果您尝试解码JSON(使用
#[派生(可解码)]
),您的第一个版本将无法工作:
&str
不实现可解码,因为
解码()
创建的对象必须是自有的。@Levans感谢您的解释。实际上,如果您尝试解码JSON(使用
#[deriving(Decodable)]
),您的第一个版本将无法工作:
&str
不实现可解码,因为
decode()创建的对象
必须是自有的。@Levans感谢您的解释。除非您有很好的理由使用切片,否则对结构字段使用
String
。对结构字段使用
String
,除非您有很好的理由使用切片。
#[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));

...
#[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));

...