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
18,582 每月下载量
用于 19 个crate (2 直接)
49KB
663 代码行
partial_ref - 类型检查的局部引用。
此crate为rust提供类型检查的局部引用。类型检查的局部引用是解决过程间借用冲突的一种方案。
安全性问题
早期版本在内部地址计算方面存在潜在的安全性问题。在最初编写时并不明确。后来变得明确,但没有可行的替代方案,所以我在这份readme中添加了警告。现在,随着Rust 1.51以来addr_of
和addr_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-APACHE或https://apache.ac.cn/licenses/LICENSE-2.0)或MIT许可协议 (LICENSE-MIT或http://opensource.org/licenses/MIT),您可任选其一。
- Apache License, Version 2.0 (LICENSE-APACHE或https://apache.ac.cn/licenses/LICENSE-2.0)
- MIT 许可协议 (LICENSE-MIT或http://opensource.org/licenses/MIT)
任选其一。
贡献
除非您明确说明,否则您根据Apache-2.0许可证定义的任何有意提交以包含在partial_ref中的贡献,将按照上述方式双许可,不附加任何额外条款或条件。
依赖项
~1.5MB
~35K SLoC