RFC 1623已在Rust 1.17.0中稳定下来,因此我们无需在'static
或static
中明确指定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 #38831有a comment:
我们决定反对它,因为在那种情况下,可能还有其他的 你想要的一生。例如:
那说,重新审视这个解释,感觉有点弱,因为 相关常数的值仍然必须全部包含在内 静态数据。因此,trait Foo<'a> { const T: &'a str; }
'static
似乎是一个相当不错的默认值 你不这么说。
具有非'static
生命周期的关联常量的示例是什么?提供非'static
生命带来的好处是什么?
答案 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
}
现在,我想不出这会比一种方法更有益。