什么是功能签名和类型?

时间:2017-02-10 10:49:14

标签: rust idioms

我在我正在学习的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只是函数签名的简写?我无法在官方文档/书籍中找到任何关于这个成语的提及。

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

1 个答案:

答案 0 :(得分:9)

函数的签名描述:

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

例如,如果您定义:

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类型很长。像任何其他类型的别名一样。