19 个版本
0.2.12 | 2024 年 1 月 2 日 |
---|---|
0.2.11 | 2023 年 7 月 21 日 |
0.2.8 | 2023 年 4 月 13 日 |
0.2.7 | 2023 年 3 月 18 日 |
0.1.2 | 2019 年 3 月 27 日 |
#1099 in Rust 模式
44,662 次每月下载
用于 64 个 crate(直接使用 29 个)
13KB
166 行代码(不包括注释)
Readonly
此 crate 提供了一个属性宏,用于暴露那些在模块内可读可写但在模块外只可读的结构体字段。
[dependencies]
readonly = "0.2"
语法
在花括号结构体或元组结构体上放置 #[readonly::make]
,这将使结构体的所有字段根据它们的各自可见性说明符公开可读,但不能从其他模块写入。
mod m {
#[readonly::make]
pub struct S {
pub n: i32,
}
impl S {
pub fn demo(&mut self) {
// Can read and write from inside the same module.
println!("{}", self.n);
self.n += 1;
}
}
}
fn demo(s: &mut m::S) {
// From outside the module, can only read.
println!("{}", s.n);
// Does not compile:
//s.n += 1;
}
错误将显示如下。
error[E0594]: cannot assign to data in a dereference of `m::S`
--> readme.rs:21:5
|
21 | s.n += 1;
| ^^^^^^^^ cannot assign
可选地,在单个结构体字段上放置 #[readonly]
,仅使那些字段公开可读,而不会影响结构体的其他字段。
#[readonly::make]
pub struct S {
// This field can be read (but not written) by super.
#[readonly]
pub(super) readable: i32,
// This field can be neither read nor written by other modules.
private: i32,
}
许可
根据您的选择,在 Apache 许可证 2.0 版或 MIT 许可证下许可。除非您明确声明,否则任何有意提交以包含在此 crate 中的贡献,根据 Apache-2.0 许可证定义,将按上述方式双重许可,而不附加任何其他条款或条件。
依赖关系
~255–700KB
~17K SLoC