如何使用impl函数声明枚举生存期?

问题描述 投票:0回答:1

我想用访问器函数声明一个枚举,该函数返回创建值时提供的值。下面是一个说明错误的人为示例:

use std::mem;

#[derive(Debug)]
enum SomeBytes<'a> {
  One([u8; 1]),
  Two([u8; 2]),
}

impl SomeBytes<'a> {

  pub fn get_bytes(&'a self) -> &'a[u8] {
    use SomeBytes::*;

    match *self {
      One(byte_array) => &byte_array,
      Two(byte_array) => &byte_array,
    }
  }
}

fn main() {
  let var1 = SomeBytes::One(*b"A");
  let var2 = SomeBytes::Two(*b"AB");

  println!("one byte = {:?}", var1);
  println!("sizeof one byte = {:?}", mem::size_of_val(&var1));
  println!("two bytes = {:?}", var2);
  println!("sizeof two bytes = {:?}", mem::size_of_val(&var2));
}

错误:

  Compiling playground v0.0.1 (/playground)
error[E0261]: use of undeclared lifetime name `'a`
 --> src/main.rs:9:16
  |
9 | impl SomeBytes<'a> {
  |                ^^ undeclared lifetime

error[E0261]: use of undeclared lifetime name `'a`
  --> src/main.rs:11:21
   |
11 |   pub fn get_bytes(&'a self) -> &'a[u8] {
   |                     ^^ undeclared lifetime

error[E0261]: use of undeclared lifetime name `'a`
  --> src/main.rs:11:34
   |
11 |   pub fn get_bytes(&'a self) -> &'a[u8] {
   |                                  ^^ undeclared lifetime

我如何编写此代码,以便对其进行编译?

请参见Rust playground

rust
1个回答
0
投票

Stargateur给了您代码而没有解释;让我们看看我是否可以填补空白。

您的代码不起作用的原因是,在struct上声明生存期会将该生存期与struct]相关联。换句话说,在每种情况下,使用或返回'a的每种方法都将采用或返回相同的'a,而不管它在何处以及如何放置。当您在struct中有一个引用,而您没有该引用时,这是值得的。结果,这是没有必要的。

如果您想全力以赴并指定生命周期,则可以这样做:

#[derive(Debug)]
enum SomeBytes {
  One([u8; 1]),
  Two([u8; 2]),
}

impl SomeBytes {

  pub fn get_bytes<'a>(&'a self) -> &'a [u8] {
    use SomeBytes::*;

    match self {
      One(ref byte_array) => byte_array,
      Two(ref byte_array) => byte_array,
    }
  }
}

生存期定义为方法

而不是struct的属性。它的附加要求是显而易见的-&self必须保证其返回参数也将遵守的生存期'a

但是,这是修脚;实际上,此生存期要求不是强制性的,可以放弃使用更简单,更自动的版本:

  pub fn get_bytes(&self) -> &[u8] {
    use SomeBytes::*;

    match self {
      One(ref byte_array) => byte_array,
      Two(ref byte_array) => byte_array,
    }
  }
© www.soinside.com 2019 - 2024. All rights reserved.