如何将存储在结构中的函数与其引用的函数进行比较

All*_*wer 1 function-pointers rust

有什么办法比较bar.foofoo

fn foo() {

}

struct Bar {
    foo: &'static (dyn Fn()),
}

fn main() {
    let bar = Bar { foo: &foo };

    if bar.foo == foo {
        println!("equal");
    }
}
Run Code Online (Sandbox Code Playgroud)

游乐场

这给出了错误: binary operation `==` cannot be applied to type `&dyn std::ops::Fn()

这个问题不适用于我的情况。它建议尝试检查返回值或将函数转换为usize. foo不返回任何内容,bar.foo也不能强制转换为usize.

jPl*_*tte 5

您可以通过先转换为原始指针引用测试函数指针平等:bar.foo as *const _ == &foo as *const _

但是请注意,这不是很健壮。您很可能会遇到您希望指针相等的情况,但事实并非如此。从reddit 帖子中引用 eddyb,该帖子提出了同样的问题

请注意,不能保证两次获得相同的函数指针 - 在将函数转换为指针时,您需要位于同一个 crate 和 codegen 单元中,才有机会。

哦,LLVM 很乐意将两个不同的函数合二为一,如果它们碰巧具有相同的主体,那么也要注意这一点。