#reference #owning #sibling #field

owning_ref_lockable

创建携带所有者的引用的库

1 个不稳定版本

0.4.2 2022年4月11日

#6 in #owning


用于 lockpool

MIT 许可证

74KB
1.5K SLoC

Build Status Crate Docs

这是从 https://github.com/Kimundi/owning-ref-rs 分支出来的,针对 https://github.com/smessmer/lockable 进行了一些必要的修复

owning-ref-rs

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

这在某些情况下可能很有用,因为 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

owning_ref = "0.4.1"

...并查看 文档 了解如何使用它。

示例

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!
}

依赖项