#reference #portal #extend #lifetime #safe #send-sync

ref-portals

安全地在原始作用域外使用(堆)引用

2 个版本

1.0.0-beta.22020年5月27日
1.0.0-beta.12020年5月24日

#2666 in Rust 模式

23 每月下载量

MIT/Apache

44KB
805

ref-portals

Latest Version docs.rs

安全地在原始作用域外使用(堆)引用。

此库提供方便的运行时检查的越界处理,它们是

  • !Send + !Sync 或(相关地) Send/Sync
  • 不可变或可变,并且
  • 目标是 Sync!Sync 值。

请参阅文档以获取更多信息。

示例

use ref_portals::rc::Anchor;

let x = "Scoped".to_owned();
let anchor = Anchor::new(&x);
let self_owned: Box<dyn Fn() + 'static> = Box::new({
    let portal = anchor.portal();
    move || println!("{}", *portal)
});

self_owned(); // Scoped

注意,在 anchor 之前丢弃 self_owned 仍然会导致恐慌。
您可以使用弱门来解决这个问题

use ref_portals::rc::Anchor;

let x = "Scoped".to_owned();
let anchor = Anchor::new(&x);
let eternal: &'static dyn Fn() = Box::leak(Box::new({
    let weak_portal = anchor.weak_portal();
    move || println!(
        "{}",
        // Panics iff the anchor has been dropped.
        *weak_portal.upgrade(),
    )
}));

eternal(); // Scoped

版本

ref-portals 严格遵循 语义版本控制 2.0.0,但有以下例外

  • 次要版本在主要版本更改时不会重置为 0。
    将其视为全局功能级别。
  • 补丁版本在主要或次要版本更改时不会重置为 0。
    将其视为全局补丁级别。

依赖关系

~120KB