如何从一个借用它的论证的函数中返回None,或者避免需要?

Isk*_*rak 1 rust

我有一个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(这是我的数据的属性,可以这么说),但这只是避免了问题.

我该怎么做呢?

Chr*_*gan 5

您可以采取以下几种方法:

  1. 添加另一层Optionness,返回一个Option<&Option<Foo>>.我猜你不想这样做.

  2. 返回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)
  3. 存储一个合适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)