gpt4 book ai didi

rust - 什么是函数签名和类型?

转载 作者:行者123 更新时间:2023-11-29 08:10:12 26 4
gpt4 key购买 nike

我在我正在研究的 Scheme 解释器中找到了下面的类型别名。在评估 AST 时,它将函数识别为 native 支持的函数或用户定义的函数。我理解 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 只是函数签名的简写?我在官方文档/书籍中找不到任何关于这个习语的提及。

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

最佳答案

函数的签名描述:

  • 它的名字
  • 它的论点
  • 结果
  • 在通用函数的情况下,它的通用参数,可能有特定的界限

例如,如果您定义:

fn hello(s: &str) {
println!("Hello {}", s);
}

函数签名是fn hello(&str) .


在 Rust 中,每个函数都有一个唯一的类型,无法命名。

但是,如果你有一个函数,你也可以将它强制转换成一个通用的 fn type 不关心函数的身份,只关心如何使用它。

对于上面的函数,这个泛型类型是: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类型很长。与任何其他类型别名一样。

关于rust - 什么是函数签名和类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42157511/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com