我在一个我正在研究的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>;
Run Code Online (Sandbox Code Playgroud)
这种类型的别名如何工作?这个定义是否说a ValueOperation只是函数签名的简写?我无法在官方文档/书籍中找到任何关于这个成语的提及.
为函数签名定义类型别名的目的是什么?你能用它"做什么"?它是某种函数指针吗?
函数的签名描述:
例如,如果您定义:
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类型很长.像任何其他类型的别名.