rust - edition = "2018" 使用或不使用`extern crate`
问题描述
我想序列化一个结构,将其打印到标准输出,从另一个程序中读取并反序列化。我发现我可以使用serde crate 和Bincode作为数据格式。
我想出了这个例子:
#[macro_use]
extern crate serde;
use bincode::{deserialize, serialize};
#[derive(Serialize, Deserialize)]
struct Entity {
x: f32,
y: f32,
}
#[derive(Serialize, Deserialize)]
struct World(Vec<Entity>);
fn main() {
let world = World(vec![Entity { x: 0.0, y: 4.0 }, Entity { x: 10.0, y: 20.5 }]);
let encoded: Vec<u8> = serialize(&world).unwrap();
println!("{:?}", encoded);
let decoded: World = deserialize(&encoded[..]).unwrap();
}
在Cargo.toml
我有:
[package]
name = "test"
version = "0.1.0"
edition = "2018"
[dependencies]
bincode = "1.1.4"
serde = { version = "1.0", features = ["derive"] }
但是让我感到困惑的是,即使我已经声明使用edition = "2018"
并且根据我的理解,这意味着extern crate serde;
可以省略,如果我删除这些行:
#[macro_use]
extern crate serde;
我收到多个错误,例如:
error: cannot find derive macro `Deserialize` in this scope
--> src/main.rs:3:21
|
3 | #[derive(Serialize, Deserialize)]
| ^^^^^^^^^^^
error: cannot find derive macro `Serialize` in this scope
--> src/main.rs:3:10
|
3 | #[derive(Serialize, Deserialize)]
| ^^^^^^^^^
error: cannot find derive macro `Deserialize` in this scope
--> src/main.rs:9:21
|
9 | #[derive(Serialize, Deserialize)]
| ^^^^^^^^^^^
error: cannot find derive macro `Serialize` in this scope
--> src/main.rs:9:10
|
9 | #[derive(Serialize, Deserialize)]
| ^^^^^^^^^
因此想知道何时或如何使用edition = "2018"
的使用#[macro_use]
让我想起了 Python 中的装饰器,可能是相同的逻辑适用于 Rust,还是正在进行标准化更多语言的工作,以便可能edition = "20XX
不需要#[macro_use]
?
#[macro_use]
extern crate serde;
我正在使用 Rust 1.35.0。
解决方案
在 2018 版中,过程宏与其他任何项目一样,因此您必须将它们纳入范围:
use serde::{Serialize, Deserialize};
推荐阅读
- javascript - 如何将 document.getElementById().textContent 用于嵌套的 JSON 数据?
- sql - 加入当前年份的表并获取上一年的记录
- go - 为什么 http.Request 没有实现 io.Reader 接口?
- python - 如何从 Python 中的字符串中获取参数?
- swift - VNRecognizeTextRequest 数字/七段数字
- google-apps-script - 如何自定义工作表标签的右键弹出菜单
- reactjs - 类型错误:未定义不是函数(靠近“...dataSource.map...”)
- python - 散景自定义扩展问题
- database - 防止覆盖键值数据存储中的键
- xcode - SwiftUI 后台线程