你引用的链接已经告诉你了:
let closure: Box<FnMut() + Send + 'env> = Box::new(closure);
let closure: Box<FnMut() + Send + 'static> = unsafe { mem::transmute(closure) };
mem::transmute相当于C++的reinterpret_cast,强制类型转换。你把'env的lifetime强制转成'static,自然可以传给任何人。不过你要自己保证实际使用closure的时间不能超过'env。
你不需要向编译器证明unsafe代码的正确性。unsafe其实是把编译器证不过去的步骤,直接写成一个公理。
跟做证明题的时候,证不过去的地方写“显然”差不多。有些人写“显然”是真的想得很清楚。有些人则是证明一卡住就“显然”过去。像后面这样写rust的人好像也不少。
【 在 z16166 的大作中提到: 】
: 嗯,crossbeam这个例子正好解决了问题。
: 而且要跨线程传栈变量的引用基本只能用这种范式了,不知道这东西的会卡在这里好久。
: 不过下一个问题来了:
: ...................
--
修改:ilovecpp FROM 58.37.58.*
FROM 58.37.58.*