gpt4 book ai didi

rust - 在 trait 实现中声明生命周期引用的是什么?

转载 作者:行者123 更新时间:2023-11-29 07:44:44 25 4
gpt4 key购买 nike

我正在学习 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)
}
}
}

我理解 CHARS 定义中的 '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]) }
}

}

这意味着返回值将与 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]) }
}

}

… 这表明必须指定您要为其实现的类型的生命周期,这样才能确实完全指定类型。它允许您为使用该生命周期的所有函数编写更少的代码。

关于rust - 在 trait 实现中声明生命周期引用的是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23073689/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com