Rust 对于一个没有';你不接受任何论据吗?

Rust 对于一个没有';你不接受任何论据吗?,rust,lifetime,lifetime-scoping,Rust,Lifetime,Lifetime Scoping,在第295页,您可以找到以下内容: 幸运的是,标准库包含了一揽子实现: 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() } } impl&U{ (*self).as_ref() } }

在第295页,您可以找到以下内容:

幸运的是,标准库包含了一揽子实现:

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()
    }
}
impl&U{
(*self).as_ref()
}
}
我对那里的
的用法感到困惑。这是什么背景?它既没有在
的参数中用作_ref
,也没有绑定到
&U
的输出。我不认为我完全理解在这种情况下使用的生命周期


我查了一下这个,因为我仍然不明白,答案仍然没有点击(有意义)。我找到了。这似乎没有任何生命周期,但它实现了
AsRef
特性。那么,为什么这本书有这样的代码,而没有实际的锈代码呢?我在哪里可以找到书中提到的“一揽子实施”?

参考文献总是对生命周期通用的。实际上,
&T
始终是编译器根据给定情况建立的某个生存期内的
&T
。在为引用类型实现某些内容时,必须以某种方式指定此生存期

曾经有一段时间,在实现语句中不可能存在终生省略。这在编译器的版本中发生了更改,但不需要因此更改所有现有的工作代码。下面的代码现在可以使用,但在1.30.0版中无法使用:

trait Foo {
    fn foo(&self) {}
}

impl<T: ?Sized> Foo for &T {} // error[E0106]: missing lifetime specifier
trait Foo{
fn foo(&self){}
}
impl-Foo for&T{}//错误[E0106]:缺少生存期说明符
因此,在这种情况下,寿命参数
'a
是显式的。它与
&self
&U
中的寿命相关的唯一方式是与
'a
存在协方差:由于
self=&a T
与寿命
'a
绑定,因此
&self
不得超过寿命
'a

它没有在
的参数中用作\u ref

当然是这样。该函数使用简写符号,可扩展为:

fn as_ref(&self) // becomes
fn as_ref(self: &Self) // becomes
fn as_ref(self: &&'a T)
也不与
&U

那么,为什么这本书有这样的代码,而没有实际的锈代码呢

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

如前所述,在本例中规定
'a
的要求已在Rust 1.31中删除,如前所述

书中提供的代码与以下代码匹配:

impl&U{
::as_ref(*self)
}
}
您查看的源代码:

impl AsRef for&T,其中T:AsRef
{
fn as_ref(&self)->&U{
::as_ref(*self)
}
}

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

而不是Rust中的实际代码-您知道Rust每6周发布一次新版本吗?大概这本书没有,那么他们引用的是什么版本的锈迹?@Shepmaster退一步,我是新来的。为什么会有区别呢?我的问题很简单,我不理解书中的终身使用,而去看我没有看到的代码(这是我所期望的)。为什么它改变了(如果它改变了)。为什么它改变了(如果它改变了)-这包括在:曾经有一段时间,在实现语句中不可能存在终身省略。在1.31版的compiler@Shepmaster无论如何,再次感谢您的回答;)我不知道我问的问题是什么。我没问你是否知道这本书可能过时了。我问你是否知道(1)锈经常释放(C和C++版本是每3-5年,为了比较,所以更有可能的是,一本书将对应于最新版本)和(2)书使用什么版本。第一个不明显,第二个不是一般知识(我没有这本书)。我喜欢这个答案,因为它显示了所有方面,包括对
convert.rs
的相关更改。我还看到
&'at
(而不是
&'a&T
)是
&T
。不管怎么说,我想我现在离这件事更近了。谢谢
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)
    }
}
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)
    }
}