我有一个Option片,给定一个值,如果该值是切片中的有效索引,我想使用该索引处的值,否则使用None.
现在,值必须能够被重用,所以我想我想借用我的切片,而不是移动...注意,这Foo并没有实现Copy特性,我宁愿保持这种方式.
我需要经常这样做,所以函数返回&Option<Foo>似乎是合适的,添加了一个生命周期说明符,因为显然返回值不应该超过它借来的切片.这导致我:
fn get_or_none<'a>(data: &'a [Option<Foo>], bar: u8) -> &'a Option<Foo> {
match bar as usize {
idx if idx < data.len() => &data[idx],
_ => &None // obviously can't work
}
}
Run Code Online (Sandbox Code Playgroud)
这显然是错误的.我现在可以作弊,因为我知道对于这个特定的应用程序,切片中的第一个值将始终为None(这是我的数据的属性,可以这么说),但这只是避免了问题.
我该怎么做呢?
您可以采取以下几种方法:
添加另一层Optionness,返回一个Option<&Option<Foo>>.我猜你不想这样做.
返回Option<&Foo>而不是&Option<Foo>:
fn get_or_none(data: &[Option<Foo>], bar: u8) -> Option<&Foo> {
match data.get(bar as usize) {
Some(&Some(ref foo)) => Some(foo),
_ => None,
}
}
Run Code Online (Sandbox Code Playgroud)存储一个合适None的静态并返回它的引用.它的寿命是'static(只要Foo是'static),所以对它的引用可以缩短到'a没有问题.
static NO_FOO: Option<Foo> = None;
fn get_or_none(data: &[Option<Foo>], bar: u8) -> &Option<Foo> {
data.get(bar as usize).unwrap_or(&NO_FOO)
}
Run Code Online (Sandbox Code Playgroud)