#static #bounded #owned #cow #derive

no-std bounded-static

定义了 ToBoundedStatic 和 IntoBoundedStatic 特性

9 个版本 (破坏性)

0.8.0 2024年6月23日
0.7.0 2023年10月25日
0.6.0 2023年10月20日
0.5.0 2023年4月29日
0.1.0 2022年2月18日

#160Rust 模式

Download history 2473/week @ 2024-05-03 2145/week @ 2024-05-10 2843/week @ 2024-05-17 2471/week @ 2024-05-24 1860/week @ 2024-05-31 2142/week @ 2024-06-07 3174/week @ 2024-06-14 2848/week @ 2024-06-21 2177/week @ 2024-06-28 2281/week @ 2024-07-05 2198/week @ 2024-07-12 2836/week @ 2024-07-19 3097/week @ 2024-07-26 2029/week @ 2024-08-02 1686/week @ 2024-08-09 3086/week @ 2024-08-16

每月下载 10,612
21 仓库中使用 21 (直接使用 7 个)

Apache-2.0

62KB
1.5K SLoC

ci Documentation Crate

有界静态

此软件包定义了 ToBoundedStaticIntoBoundedStatic 特性,ToStatic 宏,并提供常见类型的实现。此软件包无依赖项,对 no_std 友好,并禁止使用 unsafe 代码。

常见的 Rust 生命周期误解 中所述

T: 'static 应读作 "T'static 生命周期限制",而不是 "T 有一个 'static 生命周期"

可以使用特性 ToBoundedStaticIntoBoundedStatic 将任何合适的 T&T 转换为受 'static 限制的所有权 T。这两个特性定义了一个受 'static 限制的关联类型,并提供了一个将其转换为该限制类型的方法。

可以使用宏 ToStatic 自动为任何可以转换为受 'static 限制形式的 structenum 推导 ToBoundedStaticIntoBoundedStatic

有关详细信息和方法示例,请参阅软件包 文档

常见问题解答

何时使用此功能?

这对于包含必须提供给需要 'static 绑定的函数(例如 std::thread::spawn)的 Cow<T> 类型的数据结构非常有用。

#[derive(Debug, PartialEq, ToStatic)]
struct Foo<'a> {
    foo: Cow<'a, str>,
    bar: Vec<Bar<'a>>
}
#[derive(Debug, PartialEq, ToStatic)]
enum Bar<'a> {
    First,
    Second(Cow<'a, str>),
}

fn main() {
    let value = String::from("data");
    let foo = Foo {
        foo: Cow::from(&value),
        bar: vec![Bar::First, Bar::Second(Cow::from(&value))]
    };
    let foo_static = foo.into_static();
    std::thread::spawn(move || {
        assert_eq!(foo_static.foo, "data");
        assert_eq!(foo_static.bar, vec![Bar::First, Bar::Second("data".into())])
    }).join().unwrap();
}

这与 ToOwned 特性有何不同?

ToOwned 特性定义了一个关联类型 Owned,它不受 'static 绑定,因此以下代码将无法编译

use std::borrow::Cow;

fn main() {
    #[derive(Clone)]
    struct Foo<'a> {
        foo: Cow<'a, str>,
    }

    fn ensure_static<T: 'static>(_: T) {}

    let s = String::from("data");
    let foo = Foo { foo: Cow::from(&s) };
    ensure_static(foo.to_owned())
}

导致以下错误

error[E0597]: `s` does not live long enough
  --> src/lib.rs:12:36
   |
12 |     let foo = Foo { foo: Cow::from(&s) };
   |                          ----------^^-
   |                          |         |
   |                          |         borrowed value does not live long enough
   |                          argument requires that `s` is borrowed for `'static`
13 |     ensure_static(foo.to_owned())
14 | }
   | - `s` dropped here while still borrowed

Clone 替换为 ToStatic 并使用 into_static()(或根据需要使用 to_static())可以使示例编译通过

use std::borrow::Cow;

fn main() {

    #[derive(ToStatic)]
    struct Foo<'a> {
        foo: Cow<'a, str>,
    }

    fn ensure_static<T: 'static>(_: T) {}

    let s = String::from("data");
    let foo = Foo { foo: Cow::from(&s) };
    ensure_static(foo.into_static())
}

许可

bounded-static 在 Apache 许可证(版本 2.0)的条款下分发。

有关详细信息,请参阅 LICENSE

版权所有 2022

依赖关系

~0–5.5MB
~14K SLoC