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