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)
我们决定反对它,因为在那种情况下,可能还有其他你想要的生命周期.例如:
Run Code Online (Sandbox Code Playgroud)trait Foo<'a> { const T: &'a str; }那说,重新审视这个解释,感觉有点弱,因为相关常量的值仍然必须全部由静态数据组成.因此,
'static如果你不另外说,这似乎是一个非常好的默认值.
具有非'static生命周期的关联常量的示例是什么?提供非'static终身带来的好处是什么?
有人可能会考虑一个函数常量:
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)
现在,我想不出这会比一种方法更有益.