我需要在包含对满足特征的元素的引用的向量中找到由引用给出的元素的索引.

有一个层系统,它包括层特性和层堆栈(以控制操作):

pub trait Layer {
  fn new(name: &str) -> Self where Self: Sized;

  fn on_attach(&mut self);
  fn on_detach(&mut self);
  fn on_update(&mut self);
  fn on_event(&mut self, event: &mut dyn Event);

  fn get_debug_name(&self) -> &String;
}

impl PartialEq for dyn Layer {
  fn eq(&self, other: &dyn Layer) -> bool {
    self.get_debug_name() == other.get_debug_name()
  }
}

pub struct LayerStack<'a> {
  layers: Vec<&'a mut dyn Layer>,
  overlay_position: usize,
}

impl<'a> LayerStack<'a> {
  pub fn new() -> Self {
    Self {
      layers: Vec::new(),
      overlay_position: 0
    }
  }

  // ...

  pub fn find_index(&self, element: &'a dyn Layer) -> Option<usize> {
    self.layers.iter().position(|item| *item == element)
  }
}

find_index方法中有一个错误:

error: lifetime may not live long enough
8  | impl<'a> LayerStack<'a> {
   |      -- lifetime `'a` defined here
...
48 |     self.layers.iter().position(|item| *item == element)
   |                                        ^^^^^^^^^^^^^^^^ requires that `'a` must outlive `'static`

这是一个终生的问题,但我看不出有任何问题.我能做些什么呢?

我知道拥有元素本身而不是引用在一定程度上解决了这个问题,但我只需要拥有对层的可变引用,而不是拥有它们. struct 泛型中的静态生存期也不起作用:层没有静态生存期.

我对铁 rust 完全是个新手,所以处理一辈子的事情简直就是一场噩梦

推荐答案

在下面的实现中,类型表达式(dyn Layer)被称为特征对象. (need to note that 102 suppose to be an 100)

impl PartialEq for dyn Layer { /*...*/ }

由于dyn Layer不用作泛型类型的类型参数,因此Rust遵循以下规则(reference:

  • 如果特征被定义为具有单个生命周期界限,则该界限 使用的是.
  • 如果‘Static’用于任何生存期限制,则使用‘Static’.
  • 如果特征没有生存期界限,则在表达式和100中推断生存期

高亮显示的部分将应用于您的实现,因为您所做的实现中没有定义任何界限.

因此,我们可以断定,您的PartialEq实现只有在操作数具有==运算符的静态生存期时才有效.但是你的操作对象是'a,它可以是'static或者其他的东西.

impl<'a> LayerStack<'a> {
    //...
    pub fn find_index(&self, element: &'a dyn Layer) -> Option<usize> {
        self.layers.iter().position(|item| *item == element)
    }

要解决此问题,我们可以应用第一条规则(添加单一生命周期限制)

impl<'a> PartialEq for dyn Layer + 'a { /*...*/ }

Playground


或者更好的是,来自上面的引用:

如果使用‘_作为生存期界限,则界限遵循通常的省略规则.

它可以像这样实现:

impl PartialEq for dyn Layer + '_ { /*...*/ }

Rust相关问答推荐

如何在rust中有条件地分配变量?

为什么BitVec缺少Serialize trait?

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

循环访问枚举中的不同集合

在macro_rule中拆分模块和函数名

如何使用Actix Web for Rust高效地为大文件服务

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

Rust ndarray:如何从索引中 Select 数组的行

在 Rust 中,在需要引用 self 的 struct 体方法中使用闭包作为 while 循环条件

Rust proc_macro 和 syn:解析空格

使用 serde::from_value 反序列化为泛型类型

为什么在 Allocator API 中 allocate() 使用 `[u8]` 而 deallocate 使用 `u8` ?

使用占位符获取用户输入

如何在 Rust 中打印 let-else 语句中的错误?

Rust 如何返回大类型(优化前)?

pyO3 和 Panics

为什么数组不像向量那样在 for 块之后移动?

使用方法、关联函数和自由函数在 Rust 中初始化函数指针之间的区别

字符串切片的向量超出范围但原始字符串仍然存在,为什么判断器说有错误?

在 Rust 中枚举字符串的最佳方式? (字符()与 as_bytes())