#reference #owning #sibling #field #constraints

safer_owning_ref

一个创建携带其所有者的引用的库

1 个不稳定版本

使用旧的Rust 2015

0.5.0 2023年10月14日

#718 in 数据结构

Download history 28/week @ 2024-04-21 37/week @ 2024-04-28 39/week @ 2024-05-05 70/week @ 2024-05-12 158/week @ 2024-05-19 117/week @ 2024-05-26 424/week @ 2024-06-02 1029/week @ 2024-06-09 431/week @ 2024-06-16 968/week @ 2024-06-23 697/week @ 2024-06-30 63/week @ 2024-07-07 3330/week @ 2024-07-14 2231/week @ 2024-07-21 3103/week @ 2024-07-28 2090/week @ 2024-08-04

10,755 每月下载量
用于 oneshot-broadcast

MIT 许可证

74KB
1K SLoC

注意

由于广泛的需求发布修复分支作为crate,因此已重新发布此crate。但是,我无法保证此crate的安全性,并且可能无法积极维护它。

safer_owning_ref

一个创建携带其所有者的引用的库。

这有时可能很有用,因为Rust的借用规则通常防止移动已借用的类型。例如,这种代码会被拒绝

fn return_owned_and_referenced<'a>() -> (Vec<u8>, &'a [u8]) {
    let v = vec![1, 2, 3, 4];
    let s = &v[1..3];
    (v, s)
}

此库通过将所有者和引用捆绑在一起,在确保生命周期约束的包装类型中启用这种安全使用

fn return_owned_and_referenced() -> OwningRef<Vec<u8>, [u8]> {
    let v = vec![1, 2, 3, 4];
    let or = OwningRef::new(v);
    let or = or.map(|v| &v[1..3]);
    or
}

入门

要开始,请将以下内容添加到 Cargo.toml

safer_owning_ref = "0.5.0"

(注意:该包的名称是 safer_owning_ref,但crate名称仍然是 owning_ref).

...并查看如何使用它的文档

示例

extern crate owning_ref;
use owning_ref::BoxRef;

fn main() {
    // Create an array owned by a Box.
    let arr = Box::new([1, 2, 3, 4]) as Box<[i32]>;

    // Transfer into a BoxRef.
    let arr: BoxRef<[i32]> = BoxRef::new(arr);
    assert_eq!(&*arr, &[1, 2, 3, 4]);

    // We can slice the array without losing ownership or changing type.
    let arr: BoxRef<[i32]> = arr.map(|arr| &arr[1..3]);
    assert_eq!(&*arr, &[2, 3]);

    // Also works for Arc, Rc, String and Vec!
}

依赖项

~12KB