【问题标题】:How do you use boxed closures in FnMut contexts?你如何在 FnMut 上下文中使用盒装闭包?
【发布时间】:2015-10-11 22:44:47
【问题描述】:

如何在需要 FnMut 类型的上下文中使用盒装闭包,例如

pub fn main() {
  for n in (0..10).map(Box::new(|i| i * 2)) {
    println!("{}", n);
  }
}

【问题讨论】:

  • 请注意,Box<FnMut(...)> 并未隐含 FnMut 特征,但未来可能会改进这一点。
  • 我感觉你问错了问题。你真正想解决什么问题?
  • 我想在结构中存储一个MapFlatMap 迭代器,并以闭包作为参数。感谢reddit,我现在刚刚手动创建了一个实现FnMut 的结构,并将其用作map 的参数。

标签: closures rust


【解决方案1】:

由于 Box 实现了 Deref 特征,您可以简单地取消引用您的 boxed 函数:

fn main() {
    let boxed_fn = Box::new(|i| i * 2);
    for n in (0..10).map(*boxed_fn) {
        println!("{}", n);
    }
}

【讨论】:

  • 这是否意味着map表达式的类型现在很难表达了?
  • “难以表达”是什么意思?
  • 我认为类型不能写成“封闭形式”,没有额外的泛型参数,例如is.gd/pttpBX。这在尝试存储迭代器时是有问题的。通常我对此的解决方案是装箱!
  • 取消引用此 cotext 中的框将消耗它并将装箱的函数移出框到迭代器中,因为map 采用其参数值。
  • 所以如果我想描述结果值的类型(例如将其存储在结构中),我不能,因为闭包参数的类型不再是Box<FnMut ...>,而是UnnameableType.
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-08-07
  • 1970-01-01
  • 2022-11-09
  • 1970-01-01
  • 1970-01-01
  • 2017-01-26
  • 1970-01-01
相关资源
最近更新 更多