相关疑难解决方法(0)

闭包何时实现Fn,FnMut和FnOnce?

哪些具体条件为闭合来实现Fn,FnMutFnOnce特质?

那是:

  • 闭包什么时候没有实现这个FnOnce特性?
  • 闭包什么时候没有实现这个FnMut特性?
  • 闭包什么时候没有实现这个Fn特性?

例如,改变它的主体上的闭包状态会使编译器无法实现Fn它.

closures rust

97
推荐指数
2
解决办法
1万
查看次数

使用`move`关键字的闭包如何创建FnMut闭包?

到目前为止,我认为这move |...| {...}会将变量移动到闭包内,闭包只会实现FnOnce,因为你只能移动变量一次.然而,令我惊讶的是,我发现此代码有效:

extern crate futures;

use futures::stream;
use futures::stream::{Stream, StreamExt};
use std::rc::Rc;

#[derive(Debug)]
struct Foo(i32);

fn bar(r: Rc<Foo>) -> Box<Stream<Item = (), Error = ()> + 'static> {
    Box::new(stream::repeat::<_, ()>(()).map(move |_| {
        println!("{:?}", r);
    }))
}

fn main() {
    let r = Rc::new(Foo(0));
    let _ = bar(r);
}
Run Code Online (Sandbox Code Playgroud)

尽管map有这个签名:

fn map<U, F>(self, f: F) -> Map<Self, F>
where
    F: FnMut(Self::Item) -> U, 
Run Code Online (Sandbox Code Playgroud)

令我惊讶的FnMut是,在使用move关键字时创建了一个闭包,它甚至具有'static生命周期.我在哪里可以找到一些细节move?或者它是如何实际工作的?

rust

4
推荐指数
1
解决办法
523
查看次数

标签 统计

rust ×2

closures ×1