文章目录
- 注释
- 函数
- 参数
- 语句
- 表达式
- 打印
注释
Rust 中的注释方式与其它语言(C、Java)类似,支持两种注释方式:
- 普通注释
- // 对整行进行注释
- /* … */ 对区块注释
- 文档注释
- /// 生成库文档,一般用于函数或者结构体的说明,置于说明对象的上方
- //! 也生成库文档,一般用于说明整个模块的功能,置于模块文件的头部
案例:
代码语言:javascript复制/// # 文档注释: Sum函数
/// 该函数为求和函数
/// # usage:
/// assert_eq!(3, sum(1, 2));
fn sum(a: i32, b: i32) -> i32 {
a b
}
pub fn annotation() {
// 这是单行注释的示例
/*
* 这是区块注释, 被包含的区域都会被注释
* 你可以把/* 区块 */ 置于代码中的任何位置
*/
/*
注意上面区块注释中的*符号,纯粹是一种注释风格,
实际并不需要
*/
let x = 5 /* 90 */ 5;
println!("Is `x` 10 or 100? x = {}", x);
println!("2 3 = {}", sum(2, 3));
}
函数
函数在 Rust 代码中非常普遍。你已经见过语言中最重要的函数之一:main 函数,它是很多程序的入口点。你也见过 fn 关键字,它用来声明新函数。
Rust 函数的基本形式:
fn <函数名> ( <参数> ) <函数体>
Rust 代码中的函数和变量名使用 snake case 规范风格。在 snake case 中,所有字母都是小写并使用下划线分隔单词。这是一个包含函数定义示例的程序:
fn main() {
println!("Hello, World!");
another_function();
}
fn another_function() {
println!("Hello, zjq!");
}
运行结果:
Hello, World! Hello, zjq!
在Rust 中通过输入 fn 后面跟着函数名和一对圆括号来定义函数。大括号告诉编译器哪里是函数体的开始和结尾。 可以使用函数名后跟圆括号来调用我们定义过的任意函数。因为程序中已定义 another_function 函数,所以可以在 main 函数中调用它。注意,源码中 another_function 定义在 main 函数 之后;也可以定义在之前。Rust 不关心函数定义所在的位置,只要函数被调用时出现在调用之处可见的作用域内就行。
参数
Rust 中定义函数如果需要具备参数必须声明参数名称和类型,这是 Rust 设计中一个经过慎重考虑的决定:要求在函数定义中提供类型注解,意味着编译器再也不需要你在代码的其他地方注明类型来指出你的意图。而且,在知道函数需要什么类型后,编译器就能够给出更有用的错误消息。 当定义多个参数时,使用逗号分隔:
代码语言:javascript复制fn main() {
another_function(666, 888);
}
fn another_function(x: i32, y: i32) {
println!("x 的值为 : {}", x);
println!("y 的值为 : {}", y);
}
语句
函数体由一系列的语句和一个可选的结尾表达式构成。目前为止,我们提到的函数还不包含结尾表达式,不过你已经见过作为语句一部分的表达式。因为 Rust 是一门基于表达式(expression-based)的语言,这是一个需要理解的(不同于其他语言)重要区别。其他语言并没有这样的区别,所以让我们看看语句与表达式有什么区别以及这些区别是如何影响函数体的。 语句(Statements)是执行一些操作但不返回值的指令。表达式(Expressions)计算并产生一个值。
表达式
函数可以向调用它的代码返回值。我们并不对返回值命名,但要在箭头(->)后声明它的类型。在 Rust 中,函数的返回值等同于函数体最后一个表达式的值。使用 return 关键字和指定值,可从函数中提前返回;但大部分函数隐式的返回最后的表达式。 Rust 中可以在一个用 {} 包括的块里编写一个较为复杂的表达式:
代码语言:javascript复制fn main() {
let x = 5;
let y = {
let x = 3;
x 1
};
println!("x 的值为 : {}", x);
println!("y 的值为 : {}", y);
}
这是一个有返回值的函数的例子:
代码语言:javascript复制fn main() {
let x = plus_one(5);
println!("The value of x is: {x}");
}
fn plus_one(x: i32) -> i32 {
x 1
}
运行代码会打印出 The value of x is: 6。但如果在包含 x 1 的行尾加上一个分号,把它从表达式变成语句,我们将看到一个错误。
代码语言:javascript复制fn main() {
let x = plus_one(5);
println!("The value of x is: {x}");
}
fn plus_one(x: i32) -> i32 {
x 1;
}
运行代码会产生一个错误,如下:
主要的错误信息,“mismatched types”(类型不匹配),揭示了代码的核心问题。函数 plus_one 的定义说明它要返回一个 i32 类型的值,不过语句并不会返回值,使用单位类型 () 表示不返回值。因为不返回值与函数定义相矛盾,从而出现一个错误。在输出中,Rust 提供了一条信息,可能有助于纠正这个错误:它建议删除分号,这会修复这个错误。
打印
打印操作由std::fmt里面所定义的一系列宏来处理,包括:
- format!:将格式化文本输出到 字符串(String)
- print!:与 format!类似,但将文本输出到控制台
- println!: 与 print!类似,但输出结果追加一个换行符
详细的使用说明见rust官方文档: https://doc.rust-lang.org/1.0.0/std/fmt/index.html
参考: https://kaisery.github.io/trpl-zh-cn/title-page.html
本文内容到此结束了, 如有收获欢迎点赞