Я хотел бы объявить enum с функцией доступа, которая возвращает значения, которые были предоставлены при создании значения. Ниже приведен надуманный пример, иллюстрирующий ошибку:
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));
}
error:
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
Если я удалю все времена жизни из своего кода (какие текущие комментарии / ответы говорят, что они не нужны, то пример выглядит следующим образом:
use std::mem;
#[derive(Debug)]
enum SomeBytes {
One([u8; 1]),
Two([u8; 2]),
}
impl SomeBytes {
pub fn get_bytes(&self) -> &[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[E0515]: cannot return value referencing local variable `byte_array`
--> src/main.rs:14:5
|
14 | / match *self {
15 | | One(byte_array) => &byte_array,
16 | | Two(byte_array) => &byte_array,
| | ----------- `byte_array` is borrowed here
17 | | }
| |_____^ returns a value referencing data owned by the current function
error[E0515]: cannot return value referencing local variable `byte_array`
--> src/main.rs:14:5
|
14 | / match *self {
15 | | One(byte_array) => &byte_array,
| | ----------- `byte_array` is borrowed here
16 | | Two(byte_array) => &byte_array,
17 | | }
| |_____^ returns a value referencing data owned by the current function
Я должен был добавить время жизни в попытке исправить вышеуказанную ошибку, но это не было решением. Я пытался сказать компилятору, что я не хочувернуть что-то, принадлежащее текущей функции ... Может кто-нибудь объяснить соответствующее исправление?