我有一个Idx struct ,它在逻辑上是对其他数据 struct 的引用,其中其他数据 struct 的存留时间比Idx长.我希望Idxgo 引用外部数据 struct 中包含一些东西,但这是不可能的,因为我需要用类型实现deref

struct Idx<'a>(&'a Foo, usize);

impl<'a> Deref for Idx<'a> {
  fn deref<'b: 'a>(&'b self) -> &'a Self::Target { todo!() }
}

这与stdlib中的定义不匹配(而deref是一种语言项(?),所以我自己不能编写更通用的版本)

出现错误的操场:https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&gist=080dddf8854f5928dfc35f6526f57c3e

use std::ops::Deref;

struct Foo {
    xs: Vec<u8>,
}

struct Idx<'a>(&'a Foo, usize);

impl<'a> Deref for Idx<'a> {
    type Target = u8;
    fn deref(&self) -> &u8 {
        &self.0.xs[self.1]
    }
}

fn main() {
    let foo = Foo {
        xs: vec!(10, 11, 12),
    };
    let mut xs_refs: Vec<&u8> = vec!();
    for i in 0..3 {
       let idx = Idx(&foo, i);
       xs_refs.push(&*idx);
    }
}

推荐答案

遗憾的是,你确实找不到Deref英镑.

通常在这种情况下,您是Deref,但也有一个方法返回整个生命周期(this is what e.g. Pin does)的引用.这样,您可以使用Deref以常规方式调用方法,但仍有可能在需要时使用生命周期 更长的引用.

Rust相关问答推荐

为什么函数不接受选项T参数的所有权?

如何格式化传入Rust中mysql crate的Pool::new的字符串

无法定义名为&new&的关联函数,该函数的第一个参数不是self

为什么我们需要std::thread::scope,如果我们可以使用thread.join()在函数的生命周期内删除引用?

Pin<;&;mut可能将Uninit<;T>;>;合并为Pin<;&;mut T>;

习语选项<;T>;到选项<;U>;当T->;U用From定义

为什么RefCell没有与常规引用相同的作用域?

try 从标准输入获取用户名和密码并删除 \r\n

在Rust中实现Trie数据 struct 的更好方式

Rust中的一生语法有什么作用?

返回优化后的标题:返回异步块的闭包的类型擦除

Rust 编译器不统一在 if let 表达式的分支中都 impl Future 的类型

Rust 中 Mutex<> 的深拷贝?

为什么 `tokio::join!` 宏不需要 Rust 中的 `await` 关键字?

将 Futures 的生命周期特征绑定到 fn 参数

更好的方法来模式匹配带有 Rust 的窥视孔装配说明窗口?

发生移动是因为 `data` 的类型为 `Vec`,它没有实现 `Copy` 特性

Rustlings 切片原语

当引用不再被borrow 时,Rust 不会得到它

为什么可以从不可变 struct 的字段中移动?