什么是功能签名和类型?

nee*_*tza 1 idioms rust

我在一个我正在研究的S​​cheme解释器中找到了下面的类型别名.在评估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>;
Run Code Online (Sandbox Code Playgroud)

这种类型的别名如何工作?这个定义是否说a ValueOperation只是函数签名的简写?我无法在官方文档/书籍中找到任何关于这个成语的提及.

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

Mat*_* M. 9

函数的签名描述:

  • 其名称
  • 它的论点
  • 结果
  • 在泛型函数的情况下,它的泛型参数,具有潜在的特定边界

例如,如果您定义:

fn hello(s: &str) {
    println!("Hello {}", s);
}
Run Code Online (Sandbox Code Playgroud)

功能签名是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));
}
Run Code Online (Sandbox Code Playgroud)

它接近C或C++中的函数指针,但与函数指针不同,它不能为null.

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


最后我们来到这种类型的别名:它只是一个捷径,因为泛型fn类型很长.像任何其他类型的别名.