当我不关心某些参数时,Rust可以在函数类型之间进行转换吗?
我有 3 种函数类型:
type ThreadedFunction = fn(&mut Thread, Object) -> FunctionResult;
type UniversalFunction = fn(&mut Thread, Unused) -> FunctionResult;
type Function = fn(&mut Thread, &Method) -> FunctionResult;
static_assertions::assert_eq_size!(primitives::Unused, &Method);
static_assertions::assert_eq_size!(primitives::Unused, Object);
通用函数忽略第二个参数,所以我希望能够在其他两个上下文中使用它们。的大小Object,Unused和&Method相同。
我希望能够执行以下操作:
pub fn unused(thread: &mut Thread, _: Unused) -> FunctionResult {
NormalReturn
}
pub fn somewhere() -> ThreadedFunction {
unused as ThreadedFunction
}
这是不安全的:
error[E0605]: non-primitive cast: `for<'r> fn(&'r mut interpreter::Thread, interpreter::primitives::Unused) -> interpreter::FunctionResult {unused}` as `for<'r> fn(&'r mut interpreter::Thread, object::Object) -> interpreter::FunctionResult`
--> src/interpreter.rs:25:13
|
25 | unused as ThreadedFunction
| ^^^^^^^^^^^^^^^^^^^^^^^^^^ invalid cast
包裹演员unsafe {}没有帮助。
这可能是不可能的,但是能够这样做会非常方便,因为它可以节省大量代码重复。
回答
不,您不能执行此转换,因为函数引用具有不同的类型。要使两个函数具有相同的类型,所有参数类型和返回类型必须相同。
相反,您可以返回一个不捕获任何环境的闭包。因此,它可以自动转换为函数:
fn somewhere() -> ThreadedFunction {
|a, b| unused(a, Unused)
}
这相当于这个包装函数:
fn unused_adapted(thread: &mut Thread, _: Object) -> FunctionResult {
unused(thread, Unused)
}
fn somewhere() -> ThreadedFunction {
unused_adapted
}
也可以看看:
- 为什么将闭包传递给接受函数指针的函数不起作用?