rustc can“;推断适当的使用寿命”;对于给定的impl,而不是另一个impl

rustc can“;推断适当的使用寿命”;对于给定的impl,而不是另一个impl,rust,traits,lifetime,Rust,Traits,Lifetime,为令人困惑的标题道歉。。。如果有人想到一个更好的,请编辑这篇文章 我定义了这样一个特征: pub trait AsUrlParams where <Self::I as IntoIterator>::Item: Borrow<(Self::K, Self::V)>, { type I: IntoIterator; type K: AsRef<str>; type V: AsRef<str>; fn as_u

为令人困惑的标题道歉。。。如果有人想到一个更好的,请编辑这篇文章

我定义了这样一个特征:

pub trait AsUrlParams
    where <Self::I as IntoIterator>::Item: Borrow<(Self::K, Self::V)>,
{
    type I: IntoIterator;
    type K: AsRef<str>;
    type V: AsRef<str>;

    fn as_url_params(&self) -> Self::I;
}
fn as_url_params<'b>(self: &'b &'a mut Vec<(T, U)>) -> &'a mut Vec<(T, U)> {
    *self
}
我有两个问题:

  • 有没有一种方法可以为
    和'mut-Vec
    实现这种特性
  • 为什么我没有为
    和'a Vec
    点击此错误?从我一生的角度来看,它看起来完全一样:
    &self
    的内容是
    &Vec
    ,它比
    &self
    更有效

让我们比较两个函数签名,desugared。第二个是这样的:

pub trait AsUrlParams
    where <Self::I as IntoIterator>::Item: Borrow<(Self::K, Self::V)>,
{
    type I: IntoIterator;
    type K: AsRef<str>;
    type V: AsRef<str>;

    fn as_url_params(&self) -> Self::I;
}
fn as_url_params<'b>(self: &'b &'a mut Vec<(T, U)>) -> &'a mut Vec<(T, U)> {
    *self
}

在这种情况下,我们得到一个类型为
和'a Vec
的对象,该对象具有相同的借用限制-但是由于
和'a T
实现了
复制
,我们返回它的新副本。(它实现
Copy
的原因-中间借用是否结束无关紧要-我们知道存在一个使用寿命
'a
的不可变引用,因此在
'a
结束之前,对象不能以任何方式更改。)

让我们比较这两个函数签名。第二个是这样的:

pub trait AsUrlParams
    where <Self::I as IntoIterator>::Item: Borrow<(Self::K, Self::V)>,
{
    type I: IntoIterator;
    type K: AsRef<str>;
    type V: AsRef<str>;

    fn as_url_params(&self) -> Self::I;
}
fn as_url_params<'b>(self: &'b &'a mut Vec<(T, U)>) -> &'a mut Vec<(T, U)> {
    *self
}

在这种情况下,我们得到一个类型为
和'a Vec
的对象,该对象具有相同的借用限制-但是由于
和'a T
实现了
复制
,我们返回它的新副本。(它实现
Copy
的原因-中间借用是否结束无关紧要-我们知道存在一个使用寿命
'a
的不可变引用,因此在
'a
结束之前,对象不能以任何方式更改。)

链接的问题对您有帮助吗?我认为这两个问题是同一个问题。但是,您还有另一个问题:您想从
和&mut
(第二次impl的方法中的
self
类型)获得
&mut Vec
(第二次impl中的
I
类型),这是不可能的。这两个问题的答案是:按方法中的值获取
self
。如果这一切对你没有帮助,请让我们知道@卢卡斯卡尔伯托德感谢您的链接。我认为这确实可以归结为同一个问题。我确实按照你的建议解决了我的问题:用
self
而不是
&self
。谢谢!链接的问题对你有帮助吗?我认为这两个问题是同一个问题。但是,您还有另一个问题:您想从
和&mut
(第二次impl的方法中的
self
类型)获得
&mut Vec
(第二次impl中的
I
类型),这是不可能的。这两个问题的答案是:按方法中的值获取
self
。如果这一切对你没有帮助,请让我们知道@卢卡斯卡尔伯托德感谢您的链接。我认为这确实可以归结为同一个问题。我确实按照你的建议解决了我的问题:用
self
而不是
&self
。谢谢!