#struct-fields #module #accessible #macro #no-alloc

无 std readonly

使结构体字段只读,可供其他模块访问

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 模式

Download history 12806/week @ 2024-04-14 12216/week @ 2024-04-21 11333/week @ 2024-04-28 11443/week @ 2024-05-05 13387/week @ 2024-05-12 12565/week @ 2024-05-19 11816/week @ 2024-05-26 13150/week @ 2024-06-02 14262/week @ 2024-06-09 13927/week @ 2024-06-16 12795/week @ 2024-06-23 9312/week @ 2024-06-30 10954/week @ 2024-07-07 11917/week @ 2024-07-14 10661/week @ 2024-07-21 10561/week @ 2024-07-28

44,662 次每月下载
用于 64 个 crate(直接使用 29 个)

MIT/Apache 许可

13KB
166 行代码(不包括注释)

Readonly

github crates.io docs.rs build status

此 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