#reference #partial #part #ref #neighbor #borrowing #first

已弃用 partial_ref

类型检查的局部引用

9 个版本

0.3.3 2021年7月17日
0.3.2 2020年9月9日
0.3.1 2019年4月20日
0.2.0 2019年3月22日
0.1.0 2018年12月24日

#18 in #neighbor

Download history 4247/week @ 2024-03-29 4382/week @ 2024-04-05 4799/week @ 2024-04-12 4471/week @ 2024-04-19 4801/week @ 2024-04-26 4111/week @ 2024-05-03 3399/week @ 2024-05-10 4288/week @ 2024-05-17 4273/week @ 2024-05-24 4261/week @ 2024-05-31 5146/week @ 2024-06-07 4976/week @ 2024-06-14 5084/week @ 2024-06-21 4303/week @ 2024-06-28 4848/week @ 2024-07-05 3675/week @ 2024-07-12

18,582 每月下载量
用于 19 个crate (2 直接)

MIT/Apache

49KB
663 代码行

partial_ref - 类型检查的局部引用。

crates.io docs.rs

此crate为rust提供类型检查的局部引用。类型检查的局部引用是解决过程间借用冲突的一种方案。

安全性问题

早期版本在内部地址计算方面存在潜在的安全性问题。在最初编写时并不明确。后来变得明确,但没有可行的替代方案,所以我在这份readme中添加了警告。现在,随着Rust 1.51以来addr_ofaddr_of_mut的稳定,我已更新实现以避免此问题。

弃用

我编写这个库是为了在Varisat中使用。在广泛使用后,我不太确信这整体上是一个解决过程间借用冲突问题的好方法。特别是我认为实现方式过于复杂,提供的功能却相对简单。

我现在正在编写这个库的新版本,它使用略微简单的API和更简单的实现方式来实现同样的基本思想。一般来说,我会建议尝试其他替代解决方案来避免过程间借用冲突,但如果您认为局部引用是解决您用例的最佳方案,我的建议是等待这个库的新版本发布。

示例

use partial_ref::*;

part!(pub Neighbors: Vec<Vec<usize>>);
part!(pub Colors: Vec<usize>);
part!(pub Weights: Vec<f32>);

#[derive(PartialRefTarget, Default)]
pub struct Graph {
    #[part(Neighbors)]
    pub neighbors: Vec<Vec<usize>>,
    #[part(Colors)]
    pub colors: Vec<usize>,
    #[part(Weights)]
    pub weights: Vec<f32>,
}

let mut g = Graph::default();
let mut g_ref = g.into_partial_ref_mut();

g_ref.part_mut(Colors).extend(&[0, 1, 0]);
g_ref.part_mut(Weights).extend(&[0.25, 0.5, 0.75]);

g_ref.part_mut(Neighbors).push(vec![1, 2]);
g_ref.part_mut(Neighbors).push(vec![0, 2]);
g_ref.part_mut(Neighbors).push(vec![0, 1]);

pub fn add_color_to_weight(
    mut g: partial!(Graph, mut Weights, Colors),
    index: usize,
) {
    g.part_mut(Weights)[index] += g.part(Colors)[index] as f32;
}

let (neighbors, mut g_ref) = g_ref.split_part_mut(Neighbors);
let (colors, mut g_ref) = g_ref.split_part(Colors);

for (edges, &color) in neighbors.iter_mut().zip(colors.iter()) {
    edges.retain(|&neighbor| colors[neighbor] != color);

    for &neighbor in edges.iter() {
        add_color_to_weight(g_ref.borrow(), neighbor);
    }
}

文档

许可协议

partial_ref的源代码许可协议为Apache License, Version 2.0 (LICENSE-APACHEhttps://apache.ac.cn/licenses/LICENSE-2.0)或MIT许可协议 (LICENSE-MIThttp://opensource.org/licenses/MIT),您可任选其一。

任选其一。

贡献

除非您明确说明,否则您根据Apache-2.0许可证定义的任何有意提交以包含在partial_ref中的贡献,将按照上述方式双许可,不附加任何额外条款或条件。

依赖项

~1.5MB
~35K SLoC