Json 错误:键入`&;[str]`在名为'encode'的作用域中未实现任何方法`
我试图用JSON接口编写一些Rust 我希望以下结构自动从JSON编码/解码: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
#[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
实现的,notstr
这是一种您可能永远不会使用的类型
你的意思可能是用户:&'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));
...