closures - 有什么方法可以装箱和移动关闭吗?

标签 closures rust

我需要一个按值捕获并且最多被调用一次的闭包,但是我不能让函数在每个传递的闭包上使用闭包单态化,因为闭包和函数是相互递归的并且单态化阶段失败。我试过类似的东西:

fn closure_user(closure: Box<FnOnce(usize) -> bool>) -> bool {
    closure(3)
}

fn main() {
    let big_data = vec![1, 2, 3, 4];
    closure_user(Box::new(|x| {
        let _ = big_data.into_iter();
        false
    }));
}
error[E0161]: cannot move a value of type dyn std::ops::FnOnce(usize) -> bool: the size of dyn std::ops::FnOnce(usize) -> bool cannot be statically determined
 --> src/main.rs:2:5
  |
2 |     closure(3)
  |     ^^^^^^^

开箱版本为:

fn closure_user<F>(closure: F) -> bool
where
    F: FnOnce(usize) -> bool,
{
    closure(42)
}

fn main() {
    let big_data = vec![1, 2, 3, 4];
    closure_user(|x| {
        let _ = big_data.into_iter();
        false
    });
}

似乎不可能将闭包作为 FnOnce 特征对象进行装箱和拆箱。有什么方法可以装箱(无类型参数)和移动(仅调用一次)闭包吗?

最佳答案

从 Rust 1.35 开始,现在可以使用您的原始语法:

fn closure_user(closure: Box<dyn FnOnce(usize) -> bool>) -> bool {
    closure(3)
}

fn main() {
    let big_data = vec![1, 2, 3, 4];
    closure_user(Box::new(|x| {
        let _ = big_data.into_iter();
        false
    }));
}

关于closures - 有什么方法可以装箱和移动关闭吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28645624/

相关文章:

rust - 是否有可能具有比其自身尺寸更大的对齐方式?

testing - 如何测试 Rust 程序传递给另一个程序的参数?

c# - 为什么这个错误是 "local variable cannot be declared in this scope because it ... is already used"?

clojure - 什么时候使用 Clojure 的闭包?

javascript - 参数变量是否在 JavaScript 中创建闭包?

Javascript do while、setTimeout、事件变量范围

ios - 如何在 Swift 中正确地将 block 处理程序传递给此函数?

rust - 如何找到数组、向量或切片中元素的索引?

javascript - 在Wasm-Bindgen中在Rust中使用地毯

rust - 在 Rust 中 Scala 的 getOrElse 是什么?