我有一些代码,简化后,如下所示:
enum A<'a> {
AConst(&'a [u8])
}
trait FromA {
fn from_a(A) -> Self;
}
impl FromA for &[u8] {
fn from_a(a: A) -> &[u8] {
match a {
AConst(bytes) => bytes
}
}
}
fn main() {
// I'd like to use it like this:
let s = b"abc";
let a = AConst(s);
let foo: &[u8] = from_a(a);
}这不起作用,因为编译器抱怨缺少&[u8]上的生存期说明符。现在我不知道正确的人生会是什么。由于from_a使用它的参数,返回引用的生存期显然不能与参数的生存期相同。
是否有可能以某种方式使用生存期注释来实现这一目标?如果是的话,正确的注释是什么?我们能以某种方式使A类型携带有关引用生存期的信息吗?
发布于 2014-11-07 15:06:10
我们能以某种方式使
A类型携带有关引用生存期的信息吗?
事实上,这正是你写作时所做的。
enum A<'a> { //'
AConst(&'a [u8]) //'
}这里的完整类型是A<'a>,意思是A在其中包含一个生命周期'a的引用。
要正确,需要在特性定义和实现中显式地传播此生命周期:
trait FromA<'a> { //'
fn from_a(A<'a>) -> Self; //'
}
impl<'a> FromA<'a> for &'a [u8] { //'
fn from_a(a: A<'a>) -> &'a [u8] {
match a {
AConst(bytes) => bytes
}
}
}也就是说:&[u8]片的生存期是A对象中包含的引用的生存期。
然后你可以:
fn main() {
let s = b"abc";
let a = AConst(s);
let foo: &[u8] = FromA::from_a(a);
println!("{}", foo);
}
[97, 98, 99]https://stackoverflow.com/questions/26803064
复制相似问题