1 个不稳定版本
使用旧的Rust 2015
0.1.0 | 2018年11月1日 |
---|
#407 在 无标准库
200 每月下载量
在 6 个物品中(通过 alloc-singleton)使用
8KB
owned-singleton
拥有单例
许可证
根据以下任一许可证发布
- Apache许可证,版本2.0 (LICENSE-APACHE 或 http://www.apache.org/licenses/LICENSE-2.0)
- MIT许可证 (LICENSE-MIT 或 http://opensource.org/licenses/MIT)
您可以选择。
贡献
除非您明确表示,否则任何有意提交以包含在作品中的贡献,根据Apache-2.0许可证定义,应按上述方式双重许可,不附加任何额外条款或条件。
lib.rs
:
拥有单例
拥有单例是一个代理(结构体),它为给定的 static mut
变量提供独占访问。
特性
拥有单例比 &'static mut
引用更小;它们是零大小类型。
这听起来对你来说还不够有用吗?可以使用 Singleton
抽象来实现 静态分配的内存池,其句柄大小为单个字节,并在 drop
时自动释放。
示例
Singleton
属性为给定的 static mut
变量创建一个代理(结构体),并为此实现 Singleton
、Deref
、DerefMut
和 StableDeref
特性。
use owned_singleton::Singleton;
#[Singleton]
static mut FOO: u32 = 0;
let mut foo = unsafe { FOO::new() };
assert_eq!(*foo, 0);
*foo += 1;
assert_eq!(*foo, 1);
let bar: &'static mut u32 = foo.unwrap();
assert_eq!(*bar, 1);
默认情况下,Singleton
属性不实现 Send
或 Sync
特性;这会导致一个代理结构体不实现 Send
或 Sync
。要选择 Send
和 Sync
特性,请在 Singleton
属性中添加 Send
和 Sync
参数。
use owned_singleton::Singleton;
#[Singleton(Send, Sync)]
static mut FOO: u32 = 0;
fn is_send<T>() where T: Send {}
fn is_sync<T>() where T: Sync {}
is_send::<FOO>();
is_sync::<FOO>();
在静态变量上使用 Singleton
将导致代理结构体未实现 DerefMut
。然而,代理结构体仍然是对 static mut
变量的引用,因此 static mut
变量的类型上没有 Sync
的要求。
use std::marker::PhantomData;
use owned_singleton::Singleton;
// `PhantomData<*const ()>` does not implement `Send` or `Sync`
#[Singleton]
static FOO: PhantomData<*const ()> = PhantomData;
依赖关系
~2.5MB
~52K SLoC