来自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
有人可以按正确的方向给我推一下,还是用稍微简单些的方式解释一下?
答案 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()
}