首页 > 解决方案 > 如何声明一个符合函数类型的常规(非闭包)函数?

问题描述

我有一组具有共同签名的不同排序函数,因此它们可以互换地传递给其他函数。我希望能够内联声明每个都应该匹配相同的签名,所以如果其中一个与它中断,我会在上下文中得到警告。

Rust 有一个声明函数类型的语法:

type Foo = Fn(i32) -> i32;

fn bar(func: &Foo) {
    func(12);
}

我想不通的是如何声明一个符合函数类型的常规(非闭包)函数:

// this works and can be passed as a Foo, but 
// duplicates code and isn't checked against Foo
fn blah(x: i32) -> i32 {
    return x * 2;
}

// this isn't valid syntax
fn blah(x): Foo {
    return x * 2;
}

这是其他一些具有函数类型的语言的常见做法。是否有我不知道的语法,这是即将推出的功能,还是有一些技术原因阻止它被添加到 Rust?

笔记; 像这样的东西也可以达到我的目的,即使它会更笨重:

fn blah(x: i32) -> i32 {
    return x * 2;
}: Foo

标签: functional-programmingrust

解决方案


Rust 有一个声明函数类型的语法:

type Foo = Fn(i32) -> i32;

不是这样的语法(正如您可能通过它不做您想要的事实来推断的那样)。这将创建 type 的类型别名dyn Fn(i32) -> i32

您可以通过使用函数指针并为函数创建一个未使用的变量集来实现您想要的一些功能:

type MyType = fn(i32) -> i32;

fn blah(x: i32) -> i32 {
    x * 2
}

const _IGNORE: MyType = blah;

但是,我同意您以非惯用的 Rust 方式处理此问题的评论。你想创建一个东西遵守的接口,在 Rust 中这是一个trait

trait Sort {
    fn foo(_: i32) -> i32;
}

struct A;
impl Sort for A {
    fn foo(x: i32) -> i32 {
        x * 2
    }
}

fn(String)这可以通过在您的意思是fn(String);时提供 a 来防止意外地“跨越溪流” 前者是“打印此字符串”,后者是“删除命名的文件”。函数签名充其量只是一个弱接口。

也可以看看:


推荐阅读