我在我正在学习的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;用它?它是某种函数指针吗?
答案 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
类型很长。像任何其他类型的别名一样。