首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用生命周期实现索引特性

用生命周期实现索引特性
EN

Stack Overflow用户
提问于 2021-07-13 07:50:11
回答 1查看 341关注 0票数 3

我想重载这个结构的索引操作符:

代码语言:javascript
复制
struct Ram<'a> {
    ram: &'a mut [u8]
}

impl<'a> Ram<'a> {
  pub fn new( bytes: &mut[u8]) -> Ram {
    Ram {
        ram: bytes
    }
  }
}

..。它基本上是字节数组上的“控制器”。我这样做是因为我想对不同大小的字节数组重用它。我知道生命周期在这里是为了确保"ram“引用在整个执行过程中是有效的。下面是我当前的索引代码:

代码语言:javascript
复制
use std::ops::{Index};
impl<'a> Index<usize> for Ram<'a> {
    type Output = u8;
    fn index(&self, i: usize) -> &'a u8 {
        &self.ram[i]
    }
}

这不能编译。铁锈说,有一个匿名的生命周期定义与'a at the index(.)定义相冲突:"errorE0495:由于需求冲突,无法推断函数调用中的生存期参数的适当生存期“。

我该如何实现这一点?还是我对生命周期的假设完全错了?谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-07-13 08:01:58

您不需要指定返回引用的生存期(注意-> &u8)。游乐场

错误是因为Index特性要求对象的生存期说明符(&self)和返回的值(&u8)是相同的(这相当于要求&self至少活到返回引用的时间)。

为了简化编码,Rust允许跳过此生存期的显式规范,因此保留&self&u8与指定&'x self&'x u8是一样的。您只显式地指定了引用的生命周期之一,从而混淆了编译器。

代码语言:javascript
复制
use std::ops::{Index};
impl<'a> Index<usize> for Ram<'a> {
    type Output = u8;
    fn index(&self, i: usize) -> &u8 {
        &self.ram[i]
    }
}

fn main() {
    let mut _ram = [0, 1, 2, 3]; 
    let ram_holder = Ram::new(&mut _ram);
    println!("{}", ram_holder[1]);
    // prints: 1
}
票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68358481

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档