当闭合包含复杂的寿命关系时,无法为功能构建等效关闭

  • 本文关键字:功能 构建 复杂 包含 关系 rust
  • 更新时间 :
  • 英文 :


我在用同等闭合,编译器抱怨

替换功能时遇到了一些麻烦
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)

r.extend(s.range(lower..=upper));中的range方法中。但是我不知道如何将终身提示提示,也许是不可能的。

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寿命,是否应将此类错误的封闭转换为函数?

这不能轻易完成,但是您可以使用返回类型来定义外部闭合,该类型可帮助您为内部闭合设置明确的寿命边界。(通过使用for<>,这是一个较高排名的性状绑定,您可以在此处找到更多详细信息)。

需要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
        })
    };

游乐场

相关内容

  • 没有找到相关文章

最新更新