当您需要从代码中移出一个值时,根据类型系统,但在实践中不能多次调用该值,需要使用的简单工具是
Option
。将值包装在
选项
允许它
交换了的
带有
Option::None
.
当你需要一些可变的东西时,即使你在
Fn
,你需要内在的可变性;在这种情况下,
Cell
就行了。给
a complete compilable program
与您的情况近似:
use std::cell::Cell;
// Placeholders to let it compile
use std::sync::mpsc;
fn wants_fn_callback<F>(_f: F) where F: Fn() + 'static {}
struct MyStruct;
fn main() {
let (_, window_rx) = mpsc::channel::<MyStruct>();
let window_rx: Cell<Option<mpsc::Receiver<MyStruct>>> = Cell::new(Some(window_rx));
wants_fn_callback(move || {
let _: mpsc::Receiver<MyStruct> = window_rx.take().expect("oops, called twice");
});
}
Cell::take()
删除
Option<Receiver>
来自
单间牢房
,离开
None
在它的位置。这个
expect
然后删除
选项
wrapper(并处理在这种情况下函数因恐慌而被调用两次的可能性)。
应用于您最初的问题,这将是:
let window_rx: Option<Receiver<MyStruct>> = Cell::new(Some(window_rx));
application.connect_activate(move |app: >k::Application| {
build_ui(app, window_rx.take().expect("oops, called twice"));
});
但是,请小心:如果库需要
Fn
闭包,在某种情况下,函数可能会被多次调用,在这种情况下,您应该准备好在这种情况下做一些适当的事情。如果没有这样的条件,那么应该改进库的API以获得
FnOnce
相反