用等效的闭包替换功能时遇到麻烦,编译器抱怨
cannot infer an appropriate lifetime due to conflicting requirements
note: ...so that the types are compatible:
expected &std::collections::BTreeSet<&str>
found &std::collections::BTreeSet<&str> rustc(E0495)
在闭包中,位于range
中的r.extend(s.range(lower..=upper));
方法中。
但是我不知道如何将生存期提示放在一个封闭符中,也许这是不可能的。
use std::collections::BTreeSet;
fn main() {
let mut set = BTreeSet::new();
set.insert("TEST1");
set.insert("TEST3");
set.insert("TEST4");
set.insert("TEST2");
set.insert("TEST5");
println!("init: {:?}", set);
let closure = |lower, upper| {
|s: &BTreeSet<&str>| {
let mut r = BTreeSet::new();
r.extend(s.range(lower..=upper));
r
}
};
set = extract_fn("TEST2", "TEST5")(&set);
set = closure("TEST3", "TEST4")(&set);
println!("result: {:?}", set);
}
fn extract_fn<'a>(
lower: &'a str,
upper: &'a str,
) -> impl Fn(&BTreeSet<&'a str>) -> BTreeSet<&'a str> {
move |s| {
let mut r = BTreeSet::new();
r.extend(s.range(lower..=upper));
r
}
}
除了延长static
的使用期限外,是否应将具有此类错误的闭包转换为函数?
答案 0 :(得分:1)
这不容易完成,但是您可以使用返回类型定义外部闭合,这有助于您为内部闭合设置显式生命周期边界。 (通过使用for<>
(这是较高的特质界限),您可以找到更多的details in here)。
需要Box
进行内部闭包,因为Fn
特征的大小在编译时未知。
let closure = |lower, upper| -> Box<for<'a> Fn(&BTreeSet<&'a str>) -> BTreeSet<&'a str>> {
Box::new(move |s: &BTreeSet<&str>| {
let mut r = BTreeSet::new();
r.extend(s.range(lower..=upper));
r
})
};