文章目录
一、思维导图
- Rust 中的语法可以分成两大类:语句(Statement)和表达式(Expression)。语句是指要执行的一些操作和产生副作用的表达式。表达式主要用于计算求值。语句又分为两种:声明语句(Declaration statement)和表达式语句(Expression statement)。
二、案例演示 - 测试求和函数
(一)在CentOS上操作
1、创建项目 - test_func
-
执行命令:
cargo new --bin test_func
-
进入项目
test_func
2、修改主程序 - main.rs
- 执行命令:
vim src/main.rs
// extern crate std; // 声明语句,导入std标准库
// use std::prelude::v1::*; // 导入std库里的prelude模块
fn main() {
pub fn answer() -> () {
let a = 100;
let b = 150;
assert_eq!(sum(a, b), 250);
println!("{} + {} = {}", a, b, sum(a, b));
}
pub fn sum(a: i32, b: i32) -> i32 {
a + b // 作为函数返回值,跟scala语言类似
}
answer();
}
3、运行程序,查看结果
- 执行命令:
cargo run
(二)在VSCode里操作
- 启动VSCode,打开
D:\rust_work
文件夹
- 打开控制台
1、创建项目 - test_func
- 执行命令:
cargo new --bin test_func
- 进入项目
test_func
2、修改主程序 - main.rs
- 在
src
目录里的主程序main.rs
里编写代码
// extern crate std; // 声明语句,导入std标准库
// use std::prelude::v1::*; // 导入std库里的prelude模块
fn main() {
pub fn answer() -> () {
let a = 100;
let b = 150;
assert_eq!(sum(a, b), 250);
println!("{} + {} = {}", a, b, sum(a, b));
}
pub fn sum(a: i32, b: i32) -> i32 {
a + b // 作为函数返回值,跟scala语言类似
}
answer();
}
3、运行程序,查看结果
(1)命令方式
- 执行命令:
cargo run
(2)菜单方式
- 在程序编辑区单击右键,弹出快捷菜单,选择【Run Code】
(三)对代码进行解释
1、导入包与模块
- 第1行和第2行是声明语句,它们并不需要求值,只是用来引入标准库包以及
prelude
模块的。之所以注释掉,因为Rust会为每个crate
都自动引入标准库模块,除非使用#[no_std]
属性明确指定了不需要标准库。
2、如何定义函数
- 使用
fn
关键字定义了两个函数answer
和sum
。关键字fn
是function
的缩写。 - 函数
answer
没有输入参数,并且返回值为单元类型()
。单元类型拥有唯一的值,就是它本身,为了描述方便,将该值称为单元值。 - 单元类型的概念来自
OCmal
,它表示“没有什么特殊的价值
”。所以,这里将单元类型作为函数返回值,就表示该函数无返回值。当然,通常无返回值的函数默认不需要在函数签名中指定返回类型。 - 在函数
answer
中,使用let
声明了两个变量a
和b
,其后必须加分号。assert_eq!
则是宏语句,它是Rust提供的断言,允许判断给定的两个表达式求值结果是否相同。像这种名字以叹号结尾,并且可以像函数一样被调用的语句,在Rust中叫作宏。 - 编写代码时,会做出一些假设,断言就是用于在代码中捕捉这些假设,可以将断言看作是异常处理的一种高级形式。断言表示为一些布尔表达式,程序员相信在程序中的某个特定点该表达式值为真。可以在任何时候启用和禁用断言验证,因此可以在测试时启用断言,而在部署时禁用断言。同样,程序投入运行后,最终用户在遇到问题时可以重新起用断言。
- 函数
sum
的两个输入参数和返回值均指定为i32
类型。其函数体只包含了一个表达式,用于计算a
与b
的和,作为函数返回值。 - 整个程序其实可以去掉换行符,完全写成一整行代码,而不影响程序编译。
3、程序运行说明
- Rust编译器在解析代码的时候,如果碰到分号,就会继续往后面执行;如果碰到语句,则执行语句;如果碰到表达式,则会对表达式求值,如果分号后面什么都没有,就会补上单元值
()
。 - 当遇到函数的时候,会将函数体的花括号识别为块表达式(Block Expression)。块表达式是由一对花括号和一系列表达式组成的,它总是返回块中最后一个表达式的值。因此,对于
answer
函数来说,它也是一个块表达式,块中的最后一个表达式是宏语句,所以返回单元值()。对于sum
函数来说,其最后一行是一个表达式,因为没有分号,所以直接返回其求值结果。 - 从这个角度来看,可以将Rust看作一切皆表达式。由于当分号后面什么都没有时自动补单元值
()
的特点,我们可以将 Rust 中的语句看作计算结果均为()
的特殊表达式。而对于普通的表达式来说,则会得到正常的求值结果。
三、Scala语言完成同样任务
- 在
net.hw.func
包里创建TestFunc
单例对象
- 运行程序,查看结果
四、Python语言完成同样任务
- 创建
test_func.py
程序
- 运行程序,查看结果
五、Java语言完成同样任务
- 在
net.huawei.test
包里创建TestFunc
类
- 运行程序,查看结果
六、C语言完成同样任务
- 编写
test_func.c
程序
- 运行程序,查看结果
- 修改程序,让断言失败