感悟:感觉rust好像缝合怪,既有python的影子,又有java和cpp的影子,可能这就是新型编程语言趋势吧。而且他的各种规范很严格很规范,比java还更工程,各种规范不对都有warning。
命名规范:蛇形命名法,跟深度学习的python写法一样。
Rust 代码中的函数和变量名使用 snake case 规范风格。在 snake case 中,所有字母都是小写并使用下划线分隔单词。
cargo
基本上rust都是建一个项目,这样方便管理。
创建项目:
shell
cargo new pro_name
编译:
shell
cd pro_name
cargo build
直接run
shell
cd pro_name
cargo run
删除项目
shell
del pro_name -Force
变量不可变
rust中变量默认都是不可变得,如果要改变使用mut关键字来修饰变量。
rust
let foo = 3; // 不可变
let mut foo2 = 3; // 可以改变
& 引用在默认情况也是不可变的
crate
翻译为集装箱,类型于cpp中得库,python中得包。
rust
use std::io; // 导入io包
use std::rand::Rng; // 导入随机数包
隐藏(shadow)
rust 允许使用同名的新变量来隐藏旧变量的值。
rust
let a = 3; // 可以
let a = a * 3; // 可以
let a = a + 3; // 可以
布尔表达式
在cpp中,数字可以隐式转换为布尔值;而rust中,数字不可以隐式转换为布尔值。
cpp:
cpp
if(1) puts("YES");
else puts("NO");
rust:
rust
if 1 == 1 { // if 1 { } 错误
println!("YES");
} else {
println!("NO");
}
match
和 expect
expect
:
Rust 标准库中有很多叫做 Result
的类型:一个通用的 Result
以及在子模块中的特化版本,比如 io::Result
。
Result
类型是 枚举 (enumerations),通常也写作 enums 。枚举类型持有固定集合的值,这些值被称为枚举的 成员 (variants)。第六章将介绍枚举的更多细节。
Result
的成员是 Ok
和 Err
,Ok
成员表示操作成功,内部包含成功时产生的值。Err
成员则意味着操作失败,并且包含失败的前因后果。
这些 Result
类型的作用是编码错误处理信息。Result
类型的值,像其他类型一样,拥有定义于其上的方法。io::Result
的实例拥有 expect
方法。如果 io::Result
实例的值是 Err
,expect
会导致程序崩溃,并显示当做参数传递给 expect
的信息。如果 read_line
方法返回 Err
,则可能是来源于底层操作系统错误的结果。如果 io::Result
实例的值是 Ok
,expect
会获取 Ok
中的值并原样返回。在本例中,这个值是用户输入到标准输入中的字节数。
match
:
进行匹配:
rust
let guess: u32 = match guess.trim().parse() {
Ok(num) => num,
Err(_) => continue,
};
**语句和表达式 **
语句没有返回值。
rust
let x = 5; // 这是语句,没有返回值
let x = (let y = 5); // 错误, `y = 5` 没有返回值
函数调用是一个表达式。宏调用是一个表达式。我们用来创建新作用域的大括号(代码块),{}
,也是一个表达式。
rust
let x = 5;
let y = {
let x = 3;
x + 1
};
// x = 5, y = 4
这个表达式:
rust
{
let x = 3;
x + 1
}
是一个代码块,它的值是 4
。这个值作为 let
语句的一部分被绑定到 y
上。注意结尾没有分号的那一行 x+1
,与你见过的大部分代码行不同。表达式的结尾没有分号。如果在表达式的结尾加上分号,它就变成了语句,而语句不会返回值。在接下来探索具有返回值的函数和表达式时要谨记这一点。
函数
Rust不关心函数定义在哪里,只要定义了就行(与cpp系不同)。
具有返回值得函数
函数可以向调用它的代码返回值。我们并不对返回值命名,但要在箭头(->
)后声明它的类型。在 Rust 中,函数的返回值等同于函数体最后一个表达式的值。使用 return
关键字和指定值,可从函数中提前返回;但大部分函数隐式的返回最后的表达式。
rust
fn main() {
println!("{}",foo());
}
fn foo() -> i32 {
let x = 3;
x + 1 // 表达式作为返回值
}
rust
fn main() {
println!("{}",foo());
}
fn foo() -> i32 {
let x = 3;
return x + 1; // return 返回值
}
函数参数
函数也可以被定义为拥有 参数 (parameters ),参数是特殊变量,是函数签名的一部分。当函数拥有参数(形参)时,可以为这些参数提供具体的值(实参)。技术上讲,这些具体值被称为参数(arguments ),但是在日常交流中,人们倾向于不区分使用 parameter 和 argument 来表示函数定义中的变量或调用函数时传入的具体值。
在函数签名中,必须 声明每个参数的类型。这是 Rust 设计中一个经过慎重考虑的决定:要求在函数定义中提供类型注解,意味着编译器不需要你在代码的其他地方注明类型来指出你的意图。
rust
fn main() {
println!("{}",foo(4));
}
fn foo(x:i32) -> i32 {
let x = x * x;
x + 1
}