什么是函数签名和类型?
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
类型很长。与任何其他类型别名一样。
我在正在学习的 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
类型很长。与任何其他类型别名一样。