#泛型 #参数 #错误 #幻数 #编译 #行为 #所有

无 std 未使用

允许未使用的泛型参数,这些参数不表现得像它们是拥有的

2 个不稳定版本

0.1.0 2021 年 7 月 29 日
0.0.0 2021 年 6 月 24 日

#1620Rust 模式

每月 34 次下载

MIT/Apache

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> 不拥有 TLazyFromStr<T> 也只有在 T 也是的情况下才 SendSync

这就是 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许可证定义,您有意提交以包含在作品中的任何贡献,都将按照上述方式双许可,不附加任何额外条款或条件。

无运行时依赖