我在Rust中try 函数指针魔术,最后得到了一个代码片段,我完全无法解释它为什么要编译,甚至无法解释它为什么要运行.
fn foo() {
println!("This is really weird...");
}
fn caller<F>() where F: FnMut() {
let closure_ptr = 0 as *mut F;
let closure = unsafe { &mut *closure_ptr };
closure();
}
fn create<F>(_: F) where F: FnMut() {
caller::<F>();
}
fn main() {
create(foo);
create(|| println!("Okay..."));
let val = 42;
create(|| println!("This will seg fault: {}", val));
}
我无法解释why foo
是通过在caller(...)
中向F
类型的实例投射空指针来调用的.我本以为函数只能通过相应的函数指针来调用,但考虑到指针本身是空的,显然不能这样.话虽如此,我似乎显然误解了Rust类型系统的一个重要部分.