我想用访问器函数声明一个枚举,该函数返回创建值时提供的值。下面是一个说明错误的人为示例:
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
我如何编写此代码,以便对其进行编译?
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,
}
}