Rust 学习记录-注意事项

  1. 浮点数陷阱。
为了避免上面说的两个陷阱,你需要遵守以下准则:
1.避免在浮点数上测试相等性
2.当结果在数学上可能存在未定义时,需要格外的小心

fn main() {
  // 断言0.1 + 0.2与0.3相等
  assert!(0.1 + 0.2 == 0.3);
}
那如果非要进行比较呢?可以考虑用这种方式 (0.1_f64 + 0.2 - 0.3).abs() < 0.00001 ,具体小于多少,取决于你对精度的需求。
  1. 序列(Range)
    1…5,生成从 1 到 4 的连续数字,不包含 5 ;1…=5,生成从 1 到 5 的连续数字,包含 5
for i in 1..5 {
    println!("{}",i);
}
f
or i in 1..=5 {
    println!("{}",i);
}

Rust 的数值上可以使用方法. 例如你可以用以下方法来将 13.14 取整:13.14_f32.round(),在这里我们使用了类型后缀,因为编译器需要知道 13.14 的具体类型

整型溢出
比如在 u8 的情况下,256 变成 0,257 变成 1,依此类推。
当在 debug 模式编译时,Rust 会检查整型溢出,若存在这些问题,则使程序在编译时 panic(崩溃,Rust 使用这个术语来表明程序因错误而退出)。
在当使用 --release 参数进行 release 模式构建时,Rust 不检测溢出

Rust 的字符只能用 ‘’ 来表示, “” 是留给字符串的

单元类型
单元类型就是 () ,对,你没看错,就是 () ,唯一的值也是 () ,一些读者读到这里可能就不愿意了,你也太敷衍了吧,管这叫类型?
只能说,再不起眼的东西,都有其用途,在目前为止的学习过程中,大家已经看到过很多次 fn main() 函数的使用吧?那么这个函数返回什么呢?
没错, main 函数就返回这个单元类型 (),你不能说 main 函数无返回值,因为没有返回值的函数在 Rust 中是有单独的定义的:发散函数( diverge function ),顾名思义,无法收敛的函数。
例如常见的 println!() 的返回值也是单元类型 ()。
再比如,你可以用 () 作为 map 的值,表示我们不关注具体的值,只关注 key。 这种用法和 Go 语言的 struct{} 类似,可以作为一个值用来占位,但是完全不占用任何内存。

Rust 的函数体是由一系列语句组成,最后由一个表达式来返回值
语句会执行一些操作但是不会返回一个值,而表达式会在求值后返回一个值

表达式可以成为语句的一部分,例如 let y = 6 中,6 就是一个表达式,它在求值后返回一个值 6(有些反直觉,但是确实是表达式)。
调用一个函数是表达式,因为会返回一个值,调用宏也是表达式,用花括号包裹最终返回一个值的语句块也是表达式,总之,能返回值,它就是表达式:
表达式不能包含分号。这一点非常重要,一旦你在表达式后加上分号,它就会变成一条语句,再也不会返回一个值
最后,表达式如果不返回任何值,会隐式地返回一个 ()

当用 ! 作函数返回类型的时候,表示该函数永不返回( diverge function ),特别的,这种语法往往用做会导致程序崩溃的函数:

fn dead_end() -> ! {
  panic!("你已经到了穷途末路,崩溃吧!");
}

if condition {} 必须是bool 中,否则会报错,不能用 if a {} 的格式(a=3)

if for 一行的应用,返回值必须是相同类型的值。
“{}” 中替换类似于python的 f“”

fn main() {
    let condition = true;
    let number = if condition { 5 } else { "six" };
    println!("The value of number is: {number}");
}
fn main() {
    let mut counter = 0;

    let result = loop {
        counter += 1;

        if counter == 10 {
            break counter * 2;
        }
    };

    println!("The result is {result}");
}

可以给循环打上标签,指定中断或跳过 指定循环

fn main() {
    let mut count = 0;
    'counting_up: loop {
        println!("count = {count}");
        let mut remaining = 10;
        loop {
            println!("remaining = {remaining}");
            if remaining == 9 {
                break;
            }
            if count == 2 {
                break 'counting_up;
            }
            remaining -= 1;
        }
        count += 1;
    }
    println!("End count = {count}");
}

参考:

https://rustwiki.org/zh-CN/book/ch03-01-variables-and-mutability.html
https://course.rs/basic/base-type/numbers.html
https://zh.practice.rs/elegant-code-base.html

你可能感兴趣的:(Rust,rust)