Rust 在impl或方法上指定生存期参数有什么区别?
在Rust 1.3.0中,该特性在文件中具有以下特征:Rust 在impl或方法上指定生存期参数有什么区别?,rust,Rust,在Rust 1.3.0中,该特性在文件中具有以下特征: pub trait Deref { type Target: ?Sized; fn deref(&'a self) -> &'a Self::Target; } 我将实现它而不命名生命周期,因为它们无论如何都会被忽略。但是,在图中,它看起来是这样的: use std::ops::Deref; struct DerefExample<T> { value: T } impl<
pub trait Deref {
type Target: ?Sized;
fn deref(&'a self) -> &'a Self::Target;
}
我将实现它而不命名生命周期,因为它们无论如何都会被忽略。但是,在图中,它看起来是这样的:
use std::ops::Deref;
struct DerefExample<T> {
value: T
}
impl<T> Deref for DerefExample<T> {
type Target = T;
fn deref<'a>(&'a self) -> &'a T {
&self.value
}
}
fn main() {
let x = DerefExample { value: 'a' };
assert_eq!('a', *x);
}
我得到以下错误:
错误[E0308]:方法与trait不兼容
-->src/main.rs:10:5
|
10 |/fn德雷夫(&'a self)->&'T{
11 | |与自我价值
12 | | }
|寿命不匹配
|
=注意:应为类型`fn(&DerefExample)->&T`
找到类型'fn(&'a DerefExample)->&'T`
注意:10:5在方法体上定义的匿名生存期#1。。。
-->src/main.rs:10:5
|
10 |/fn德雷夫(&'a self)->&'T{
11 | |与自我价值
12 | | }
| |_____^
注:……不一定比impl上定义的7:1的寿命“a”长
-->src/main.rs:7:1
|
7 |/impl&'a T{
11 | |与自我价值
12 | | }
13 | | }
| |_^
这使我困惑。该方法的签名与文档中的签名相同。此外,我认为在impl上指定life参数与直接在方法上指定life参数之间的区别仅在参数的范围内,因此它可以在整个impl块中使用,而不仅仅是在方法中使用。我在这里遗漏了什么?是的,有区别 该方法的签名与文档中的签名相同 在文档中看起来像这样的事实是rustdoc的错误,并且已经解决了 如果您按文档右上角的
[src]
链接,您将被重定向到Deref
的实际来源,如下所示(我已经删除了额外的属性和注释):
在这里,first_two()
方法返回一个具有存储在Bytes
结构中的值的生存期的切片。方法的调用者无法决定他们想要的生存期-它总是固定在调用此方法的结构内部的切片的生存期。在保持相同语义的情况下,也不可能将life参数下放到方法中,我想您可以理解原因
在您的例子中,您指定的生存期参数既不参与
impl
的签名,也不参与任何关联类型,因此理论上可以像在每个函数上单独声明一样使用它(因为在调用方法时它可以是任意的),但随后是关于方法签名的推理(以上提供)开始。这些对不同问题的回答也可能回答您的问题:而且非常详细,解释得非常好。谢谢。我仍然不明白:如果我将生存期限制为自我
,为什么它与impl
子句中出现的生存期不同?
struct DerefExample<T> {
value: T
}
impl<'a, T> Deref for DerefExample<T> {
type Target = T;
fn deref(&'a self) -> &'a T {
&self.value
}
}
pub trait Deref {
type Target: ?Sized;
fn deref<'a>(&'a self) -> &'a Self::Target;
}
struct Bytes<'a>(&'a [u8]);
impl<'a> Bytes<'a> {
fn first_two(&self) -> &'a [u8] {
&self.0[..2]
}
}