2 个不稳定版本
0.1.0 | 2021 年 7 月 29 日 |
---|---|
0.0.0 | 2021 年 6 月 24 日 |
#1620 在 Rust 模式
每月 34 次下载
20KB
305 行
未使用
关于未使用
该 unused
包允许类型具有未使用的泛型参数,这些参数不表现得像它们是拥有的。
示例
想象我们有一个名为 LazyFromStr
的结构体,它包含一个 &'static str
并可以使用其 FromStr
实现懒加载 T
。
要让 T
成为 LazyFromStr
的泛型参数,我们可以使用 PhantomData
。否则,我们会得到编译错误,表明参数 T
从未使用。
use std::marker::PhantomData;
use std::str::FromStr;
struct LazyFromStr<T> {
str: &'static str,
phantom: PhantomData<T>,
}
impl<T: FromStr> LazyFromStr<T> {
fn create(&self) -> T {
match T::from_str(self.str) {
Ok(t) => t,
Err(_) => panic!(),
}
}
}
使用 PhantomData
的问题在于,即使我们的 LazyFromStr<T>
不拥有 T
,LazyFromStr<T>
也只有在 T
也是的情况下才 Send
和 Sync
。
这就是 unused
发挥作用的地方。
// We need to import `Unused`.
use unused::Unused;
struct LazyFromStr<T> {
str: &'static str,
// Use the `Unused` macro instead of `PhantomData`.
unused: Unused!(T),
}
use std::convert::Infallible;
use std::rc::Rc;
// `RcString` is not `Send` or `Sync`.
struct RcString(Rc<String>);
impl FromStr for RcString {
type Err = Infallible;
fn from_str(str: &str) -> Result<Self, Self::Err> {
Ok(Self(Rc::new(str.to_owned())))
}
}
let lazy: LazyFromStr<RcString> = LazyFromStr {
str: "a",
// Use `Unused` as a value.
unused: Unused,
};
use std::thread;
// `lazy` is `Send` (even though `RcString` is not), so we can send it between threads.
thread::spawn(move ||{
let _ = lazy.create();
})
.join()
.unwrap();
用法
首先,将 unused
添加到您的 Cargo.toml
中的 dependencies
unused = "0.1"
创建一个具有未使用泛型参数的简单结构体
use unused::Unused;
struct Foo<T> {
some_string: String,
unused: Unused!(T),
}
let foo: Foo<usize> = Foo {
some_string: "hello".to_owned(),
unused: Unused,
};
有关完整文档,请参阅 文档。
反馈
如果您遇到任何问题或有任何反馈,请随时在 GitHub 仓库 上提交问题。
相关/类似包
- type_variance - 标记子类型变异性特质
- ghost - 定义您自己的 PhantomData
- rich-phantoms - 具有控制方差和继承同步/异步的 Phantom 类型
许可证
以下任一许可证下授权:
- Apache 许可证 2.0 (LICENSE-APACHE 或 http://apache.ac.cn/licenses/LICENSE-2.0)
- MIT许可证(《LICENSE-MIT》或http://opensource.org/licenses/MIT)
由您自行选择。
贡献
除非您明确表示,否则根据Apache-2.0许可证定义,您有意提交以包含在作品中的任何贡献,都将按照上述方式双许可,不附加任何额外条款或条件。