首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >计算从消耗值中引用的生存期

计算从消耗值中引用的生存期
EN

Stack Overflow用户
提问于 2014-11-07 14:06:27
回答 1查看 97关注 0票数 3

我有一些代码,简化后,如下所示:

代码语言:javascript
复制
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类型携带有关引用生存期的信息吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-11-07 15:06:10

我们能以某种方式使A类型携带有关引用生存期的信息吗?

事实上,这正是你写作时所做的。

代码语言:javascript
复制
enum A<'a> {                                //'
    AConst(&'a [u8])                        //'
}

这里的完整类型是A<'a>,意思是A在其中包含一个生命周期'a的引用。

要正确,需要在特性定义和实现中显式地传播此生命周期:

代码语言:javascript
复制
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对象中包含的引用的生存期。

然后你可以:

代码语言:javascript
复制
fn main() {
    let s = b"abc";
    let a = AConst(s);
    let foo: &[u8] = FromA::from_a(a);
    println!("{}", foo);
}

[97, 98, 99]
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26803064

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档