如何接受Option <string>,对其进行处理并返回Option <string>?

时间:2018-10-12 19:24:30

标签: rust

来自Python,我在把握生命周期方面遇到一些麻烦。我正在尝试实现此琐碎功能以返回Option<String>,但我无法获取它。到目前为止,我所能做的就是:

fn match_exception(exception: Option<String>) -> String {
    let piles = ["a", "b"];
    exception
        .unwrap_or("".to_string())
        .split(',')
        .map(|exc| exc.trim())
        .filter(|exc| piles.contains(exc))
        .next()
        .unwrap_or("")
        .to_string()
}

这将返回一个String(更不用说对我而言是笨拙的),但是我希望它能以与输入的相同格式Option<String>回来。

如果我在next调用后删除所有内容,它将返回Option<&str>,如果我继续将期望的返回类型重新定义为Option<&str>,它会抱怨我还没有设置生存期:

error[E0106]: missing lifetime specifier
 --> src/lib.rs:1:57
  |
1 | fn match_exception(exception: Option<String>) -> Option<&str> {
  |                                                         ^ expected lifetime parameter
  |
  = help: this function's return type contains a borrowed value with an elided lifetime, but the lifetime cannot be derived from the arguments
  = help: consider giving it an explicit bounded or 'static lifetime

有人可以按正确的方向给我推一下,还是用稍微简单些的方式解释一下?

1 个答案:

答案 0 :(得分:4)

如果返回Option<&str>,则返回的&str必须引用函数返回后可用的内容。由于您将Option<String>传递给函数,因此一旦函数返回,该值将不可用。

如果转换字符串切片to_string,则可以使用以下内容:

fn match_exception(exception: Option<String>) -> Option<String> {
    let piles = ["a", "b"];
    exception
        .unwrap_or("".to_string())
        .split(',')
        .map(|exc| exc.trim())
        .filter(|exc| piles.contains(exc))
        .map(|s| s.to_string())
        .next()
}

请注意,|s| s.to_string()相对昂贵。

您实际上可能想做的是首先接受Option<&str>

fn match_exception(exception: Option<&str>) -> Option<&str> {
    let piles = ["a", "b"];
    exception
        .unwrap_or("")
        .split(',')
        .map(|exc| exc.trim())
        .filter(|exc| piles.contains(exc))
        .next()
}