何时使用关联常量来使用除静态以外的生命周期?

She*_*ter 7 const rust associated-types

在Rust 1.17.0中稳定的RFC 1623使得我们不必'static在a static或中明确指定生命周期const:

const MY_DEFAULT_NAME: &str = "Anna";
//                      ^ Look, ma! No 'static!
Run Code Online (Sandbox Code Playgroud)

RFC 195定义了相关的常量,这些常量在Rust 1.20.0中得到了稳定:

struct A;

impl A {
    const B: i32 = 42;
}
Run Code Online (Sandbox Code Playgroud)

尝试将这两者结合使用时,会出现错误:

struct A;

impl A {
    const MY_DEFAULT_NAME: &str = "Anna";
}
Run Code Online (Sandbox Code Playgroud)
error[E0106]: missing lifetime specifier
 --> src/main.rs:4:28
  |
4 |     const MY_DEFAULT_NAME: &str = "Anna";
  |                            ^ expected lifetime parameter
Run Code Online (Sandbox Code Playgroud)

相关GitHub的问题#38831一个评论:

我们决定反对它,因为在那种情况下,可能还有其他你想要的生命周期.例如:

trait Foo<'a> {
    const T: &'a str;
}
Run Code Online (Sandbox Code Playgroud)

那说,重新审视这个解释,感觉有点弱,因为相关常量的值仍然必须全部由静态数据组成.因此,'static如果你不另外说,这似乎是一个非常好的默认值.

具有非'static生命周期的关联常量的示例是什么?提供非'static终身带来的好处是什么?

Fra*_*gné 5

有人可能会考虑一个函数常量:

trait Foo<'a> {
    const BAR: fn(&Self) -> &'a str;
}

struct MyFoo<'a> {
    x: &'a str,
}

impl<'a> Foo<'a> for MyFoo<'a> {
    const BAR: fn(&Self) -> &'a str = my_bar;
}

fn my_bar<'a>(a: &MyFoo<'a>) -> &'a str {
    &a.x
}
Run Code Online (Sandbox Code Playgroud)

现在,我想不出这会比一种方法更有益.