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

时间:2017-10-01 19:55:01

标签: rust const associated-types

RFC 1623已在Rust 1.17.0中稳定下来,因此我们无需在'staticstatic中明确指定const生命周期:

const MY_DEFAULT_NAME: &str = "Anna";
//                      ^ Look, ma! No 'static!

RFC 195定义了相关常量,它们在Rust 1.20.0中得到了稳定:

struct A;

impl A {
    const B: i32 = 42;
}

尝试合并这两者时,会出现错误:

struct A;

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

related GitHub issue #38831a comment

  

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

trait Foo<'a> {
    const T: &'a str;
}
     那说,重新审视这个解释,感觉有点弱,因为   相关常数的值仍然必须全部包含在内   静态数据。因此,'static似乎是一个相当不错的默认值   你不这么说。

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

1 个答案:

答案 0 :(得分: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
}

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