当我不关心某些参数时,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);

通用函数忽略第二个参数,所以我希望能够在其他两个上下文中使用它们。的大小ObjectUnused&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
}

也可以看看:

  • 为什么将闭包传递给接受函数指针的函数不起作用?

以上是当我不关心某些参数时,Rust可以在函数类型之间进行转换吗?的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>