什么是函数签名和类型?

What is a function signature and type?

我在正在学习的 Scheme 解释器中找到了下面的类型别名。在评估 AST 时,它将函数识别为本机支持的函数或用户定义的函数。我理解 Enum 定义的第二部分,但第一部分让我难以理解。

pub enum Function {
    Native(ValueOperation),
    Scheme(Vec<String>, Vec<Value>, Rc<RefCell<Environment>>),
}


type ValueOperation = fn(&[Value], Rc<RefCell<Environment>>) -> Result<Value, RuntimeError>;

这个类型别名是如何工作的?这个定义是说 ValueOperation 只是函数签名的 shorthand 吗?我在官方 docs/books.

中找不到任何提及这个成语的地方

为函数签名定义类型别名的目的是什么?你能"do"用它做什么?它是某种函数指针吗?

函数的签名描述:

  • 它的名字
  • 它的参数
  • 其结果
  • 在泛型函数的情况下,它的泛型参数可能具有特定的界限

例如,如果您定义:

fn hello(s: &str) {
    println!("Hello {}", s);
}

函数签名是fn hello(&str)


在 Rust 中,每个函数都有一个唯一的类型,无法命名。

然而,如果你有一个函数,你也可以将它强制转换为一个通用的 fn 类型,它不关心函数的身份,只关心如何使用它。

对于上面的函数,这个泛型类型是:fn(&str)(或者 fn(&str) -> (),如果我们希望明确的话)。


此泛型类型可用于抽象具有相似签名的多个函数。例如:

fn add(left: i32, right: i32) -> i32 { left + right }
fn sub(left: i32, right: i32) -> i32 { left - right }

fn select(name: &str) -> fn(i32, i32) -> i32 {
    match name {
        "add" => add,
        "sub" => sub,
        _ => unimplemented!(),
    }
}

fn main() {
    let fun = select("add");
    println!("{} + {} = {}", 1, 2, fun(1, 2));
}

它接近于 C 或 C++ 中的函数指针,但与函数指针不同的是它不能为空。

如果您需要可空函数,可以使用 Option<fn(i32, i32) -> i32>


因此我们终于找到了这个类型别名:它只是一个快捷方式,因为通用 fn 类型很长。与任何其他类型别名一样。