Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Rust 在impl或方法上指定生存期参数有什么区别?_Rust - Fatal编程技术网

Rust 在impl或方法上指定生存期参数有什么区别?

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<

在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<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]
    }
}