&[isize] { v.as_mut_slice() } 这不是: fn f(v: &mut Vec) -> &[-6ren">
gpt4 book ai didi

rust - 为什么在 "as_slice"的情况下引用的生命周期不够长?

转载 作者:行者123 更新时间:2023-11-29 07:51:37 25 4
gpt4 key购买 nike

我不明白为什么这段代码可以编译:

fn f(v: &mut Vec<isize>) -> &[isize] {
v.as_mut_slice()
}

这不是:

fn f(v: &mut Vec<isize>) -> &[isize] {
v.as_slice()
}

制作:

<anon>:2:5: 2:6 error: `v` does not live long enough
<anon>:2 v.as_slice()
^
<anon>:1:38: 3:2 note: reference must be valid for the anonymous lifetime #1 defined on the block at 1:37...
<anon>:1 fn f(v: &mut Vec<isize>) -> &[isize] {
<anon>:2 v.as_slice()
<anon>:3 }
<anon>:1:38: 3:2 note: ...but borrowed value is only valid for the block at 1:37
<anon>:1 fn f(v: &mut Vec<isize>) -> &[isize] {
<anon>:2 v.as_slice()
<anon>:3 }

如果我理解正确,在任何一种情况下函数签名都是相同的,并且返回值生命周期等于输入参数生命周期。那么为什么“as_slice”不起作用?

最佳答案

这是 AsSlice 特性的一个“错误”或更好的限制。由于 v.as_slice() 现在不稳定并且可能会被删除以支持 &v[] (在您的情况下已经按预期工作)我不会打开错误,但据我所知,我会尝试解释为什么当前特征不起作用。

首先,看definition of the as_slice在您的案例中调用。

impl<'a, T, U: ?Sized + AsSlice<T>> AsSlice<T> for &'a mut U {
#[inline(always)]
fn as_slice(&self) -> &[T] { AsSlice::as_slice(*self) }
}

请注意,as_slice 实际上是在省略一个新的生命周期。如果我们给它起一个名字('b),我们实际上是在写这样的东西:

impl<'a, T, U: ?Sized + AsSlice<T>> AsSlice<T> for &'a mut U {
#[inline(always)]
fn as_slice<'b>(&'b self) -> &'b [T] { AsSlice::as_slice(*self) }
}

我们实际上想要的是 'b'a 相同,但我认为当时没有办法表达这一点 AsSlice 已创建(现在这可以通过更高等级的特征边界实现)。这样做的效果是,当我们在您的函数 f 中调用 as_slice() 时,我们将返回一个无法逃脱 f。这实际上是您遇到的错误。

如果现在编写 AsSlice,它将使用关联类型并且能够以我们想要的方式链接生命周期。这将是类似这样的东西:

pub trait AsSlice2 {
type Item;
fn as_slice_2(&self) -> & [Self::Item];
}

impl<T> AsSlice2 for [T] {
type Item = T;
fn as_slice_2(&self) -> &[T] { &self[] }
}

playpen

这类似于 as_mut_slice 当前的实现方式(这就是它起作用的原因)

关于rust - 为什么在 "as_slice"的情况下引用的生命周期不够长?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28175681/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com