Rust 编程语言中的函数
函数是代码的构建块。它们使我们能够避免编写类似的代码,并有助于将大段代码组织成可重用的组件。
在 Rust 中,函数随处可见。甚至函数定义也是 Rust 中的语句。
Rust 中最重要的函数之一是 main 函数,它是任何软件或应用程序的入口点。
我们在 Rust 中使用 fn 关键字来声明函数。
在 Rust 中,函数的名称使用蛇形命名法作为约定俗成的风格。在蛇形命名法中,单词的所有字母都小写,并且使用 _(下划线)来分隔两个单词。
考虑一个简单的函数,我们在这个函数中打印“Hello, Tuts!”。
文件名:src/main.rs
示例
fn main() { println!("Hello, Tuts!"); }
输出
上面代码的输出为:
Hello, Tuts!
在上面的代码片段中,函数定义以 fn 关键字开头,后跟函数名后的一个括号对。花括号是函数体的一部分,它们告诉编译器函数体从哪里开始以及在哪里结束。
调用另一个函数
在 Rust 中调用/调用函数类似于其同类语言。我们只需要输入其名称,后跟括号即可。
以下代码片段为例。
文件名:src/main.rs
示例
fn main() { sample(); println!("Hello, Tuts!"); } fn sample(){ println!("another function”); }
输出
上面代码的输出为:
Compiling hello-tutorialspoint v0.1.0 (/Users/immukul/hello-tutorialspoint) Finished dev [unoptimized + debuginfo] target(s) in 1.04s Running `target/debug/hello-tutorialspoint` another function Hello, Tuts!
Rust 不在乎你在哪里定义你正在调用的函数,唯一重要的是它应该被定义。
函数参数
参数是在定义函数时放在括号内的值。它们是函数签名的组成部分。
让我们稍微修改上面的示例,并将参数传递给我们正在调用的函数,并看看它是如何工作的。
文件名:src/main.rs
示例
fn main() { sample(5); println!("Hello, Tuts!"); } fn sample(x : i32){ println!("The value of x is : {} ", x); }
输出
Finished dev [unoptimized + debuginfo] target(s) in 0.01s Running `target/debug/hello-tutorialspoint` The value of x is : 5 Hello, Tuts!
我们通过调用 sample(5); 来调用函数,这反过来又调用了具有名为 x 的参数的 sample 函数。参数 x 被分配了类型 i32。然后 println()! 宏打印此参数的值。
需要注意的是,如果在函数括号中定义了多个参数,则所有这些参数都必须声明类型。
以下代码片段作为参考。
文件名:src/main.rs
示例
fn main() { sample(5,7); println!("Hello, Tuts!"); } fn sample(x : i32, y : i32){ println!("The value of x is : {} ", x); println!("The value of y is : {} ", y); }
输出
Compiling hello-tutorialspoint v0.1.0 (/Users/immukul/hello-tutorialspoint) Finished dev [unoptimized + debuginfo] target(s) in 0.51s Running `target/debug/hello-tutorialspoint` The value of x is : 5 The value of y is : 7 Hello, Tuts
带有返回值的函数
函数可以返回值给调用函数。这是函数非常常见的用例。
文件名:src/main.rs
fn main() { let z = sample(5); println!("Output is: {}",z); } fn sample(x : i32) -> i32{ x + 1 }
调用函数 sample 并传递 5 作为参数,然后将该函数返回的值存储到名为 z 的变量中,最后使用 println()! 宏打印该值。
需要注意的是,如果我们将函数 sample 从表达式更改为语句,则 Rust 编译器将抛出编译错误。
文件名:src/main.rs
示例
fn main() { let z = sample(5); println!("Output is: {}",z); } fn sample(x : i32) -> i32{ x + 1; }
输出
Compiling hello-tutorialspoint v0.1.0 (/Users/immukul/hello-tutorialspoint) error[E0308]: mismatched types --> src/main.rs:6:23 | 6 | fn sample(x : i32) -> i32{ | ------ ^^^ expected `i32`, found `()` | | | implicitly returns `()` as its body has no tail or `return` expression 7 | x + 1; | - help: consider removing this semicolon error: aborting due to previous error For more information about this error, try `rustc --explain E0308`. error: could not compile `hello-tutorialspoint`
发生这种情况是因为函数 sample 预期返回一个 i32 值,但在其内部,存在一个不计算为值的语句,因此与函数声明相矛盾。只需删除分号即可将语句转换为表达式,代码将正常工作。