【发布时间】:2020-11-19 17:09:30
【问题描述】:
我在 Rust 中试验了函数指针魔术,最后得到了一个代码 sn-p,我完全无法解释它为什么编译,甚至更多,为什么它运行。
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));
}
我无法解释为什么通过将caller(...) 中的空指针转换为F 类型的实例来调用foo。我原以为只能通过相应的函数指针调用函数,但鉴于指针本身为空,显然情况并非如此。话虽如此,看来我显然误解了 Rust 类型系统的一个重要部分。
【问题讨论】:
-
话虽如此,看来我显然误解了 Rust 类型系统的一个重要部分。 => 并非如此。未定义的行为意味着任何事情都可能发生,包括不时获得您期望的行为。
-
可能只是因为您选择了 42。
标签: rust