对于不带任何参数的方法来说,显式生命周期有什么意义?

2024-01-26

第 295 页Rust 编程 http://shop.oreilly.com/product/0636920040385.do您可以找到以下内容:

幸运的是,标准库包含了总体实现:

impl<'a, T, U> AsRef<U> for &'a T
where
    T: AsRef<U>,
    T: ?Sized,
    U: ?Sized,
{
    fn as_ref(&self) -> &U {
        (*self).as_ref()
    }
}

我对使用感到困惑&'a那里。其背景是什么?它没有被用在争论中as_ref也不与输出相关&U。我认为我不完全理解在这种情况下使用生命周期。

我查了一下这个,因为我仍然不明白它,而且答案仍然没有点击(有意义)。我发现convert.rs https://doc.rust-lang.org/1.37.0/src/core/convert.rs.html。这个好像没有any任何地方的生命周期,但它实现了AsRef特征。那么为什么书中有这个,而不是 Rust 中的实际代码呢?哪里可以找到书中提到的“一揽子实施”?


它没有被用在争论中as_ref

确实如此。该函数使用简写符号,可以扩展:

fn as_ref(&self) // becomes
fn as_ref(self: &Self) // becomes
fn as_ref(self: &&'a T)

也不与输出相关&U

Correct.

那么为什么书中有这个,而不是 Rust 中的实际代码呢?

Rust 每 6 周发布一次新的稳定版本。据推测这本书没有,所以他们很可能使用的是旧版本的 Rust。希望这本书能告诉你他们开发的版本。

As E_net4已经说明 https://stackoverflow.com/a/58030681/155423,要求指定'a在这种情况下,Rust 1.31 中已被删除,如下所示记录在版本指南中 https://doc.rust-lang.org/edition-guide/rust-2018/ownership-and-lifetimes/lifetime-elision-in-impl.html.

您从书中提供的代码与此匹配在 Rust 1.30 中发现 https://github.com/rust-lang/rust/blob/1.30.0/src/libcore/convert.rs#L410-L415:

impl<'a, T: ?Sized, U: ?Sized> AsRef<U> for &'a T where T: AsRef<U>
{
    fn as_ref(&self) -> &U {
        <T as AsRef<U>>::as_ref(*self)
    }
}

您查看的源代码对应 Rust 1.37 https://github.com/rust-lang/rust/blob/1.37.0/src/libcore/convert.rs#L494-L499:

impl<T: ?Sized, U: ?Sized> AsRef<U> for &T where T: AsRef<U>
{
    fn as_ref(&self) -> &U {
        <T as AsRef<U>>::as_ref(*self)
    }
}

这大约需要 42 周的开发时间,足以更改源代码。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

对于不带任何参数的方法来说,显式生命周期有什么意义? 的相关文章

随机推荐