在特征实现中声明时,生命周期引用是什么?

Twe*_*les 9 rust

我正在学习有关锈病命名的寿命,而且我无法理解当他们在一个性状的执行中使用它们代表什么.具体地讲,我无法理解这一段代码从libserialize/hex.rs.为简洁起见,我删除了一些评论.

pub trait ToHex {
    fn to_hex(&self) -> ~str;
}

static CHARS: &'static[u8] = bytes!("0123456789abcdef");

impl<'a> ToHex for &'a [u8] {
    fn to_hex(&self) -> ~str {
        let mut v = slice::with_capacity(self.len() * 2);
        for &byte in self.iter() {
            v.push(CHARS[(byte >> 4) as uint]);
            v.push(CHARS[(byte & 0xf) as uint]);
        }

        unsafe {
             str::raw::from_utf8_owned(v)
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

据我所知,'static在煤焦定义一辈子,但我难倒在ToHex实现中定义的寿命.在生成特征时,命名生命周期代表什么?

Chr*_*gan 8

在这种特殊情况下,并不多.&[u8]不是完全指定的类型,因为寿命缺失,和实现必须是完全指明的类型.因此,实施是参数在任意的(针对通用参数不受约束)的寿命'a.

在这种情况下,您不要再使用它.但是,在某些情况下,当您希望约束函数参数或将值返回到同一生命周期时.

然后,您可以这样写:

impl<'a, T> ImmutableVector<'a, T> for &'a [T] {
    fn head(&self) -> Option<&'a T> {
        if self.len() == 0 { None } else { Some(&self[0]) }
    }
    …
}
Run Code Online (Sandbox Code Playgroud)

这意味着,返回值将有相同的寿命为self,'a.

顺便说一句,只是把事情搞得一团糟,寿命可以手动写在每个功能:

impl<'a, T> ImmutableVector<'a, T> for &'a [T] {
    fn head<'a>(&'a self) -> Option<&'a T> {
        if self.len() == 0 { None } else { Some(&self[0]) }
    }
    …
}
Run Code Online (Sandbox Code Playgroud)

......这表明,必须指定要执行该类型的寿命就是这么认为的类型确实是完全确定.它可以让你写那么一点点的所有函数中使用该寿命.