我正在学习有关锈病命名的寿命,而且我无法理解当他们在一个性状的执行中使用它们代表什么.具体地讲,我无法理解这一段代码从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实现中定义的寿命.在生成特征时,命名生命周期代表什么?
在这种特殊情况下,并不多.&[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)
......这表明,必须指定要执行该类型的寿命就是这么认为的类型确实是完全确定.它可以让你写那么一点点的所有函数中使用该寿命.
| 归档时间: |
|
| 查看次数: |
3186 次 |
| 最近记录: |