美文网首页
20240229Rust学习笔记及代码02

20240229Rust学习笔记及代码02

作者: 李荣强Justin | 来源:发表于2024-02-28 09:49 被阅读0次

    20240225Rust学习笔记

    cargo build 编译并构建可执行文件

    cargo run 编译并构建可执行文件,并且执行该程序

    cargo check 只编译并不产生可执行文件,速度比build/run都快

    cargo build --release 编译并构建可执行文件,同时发布

          代码会运行的更快,但是编译的时间会更长

    let mut 声明可变变量,rust默认是不可变量,只能赋值一次,加了mut后可以多次赋值

    const 声明常量,大写,可以在外部,也可以在函数内部声明,不能改

    i32 f64 默认类型,

    shadow机制,同名变量重新赋值可以变不同的类型

    cargo update 更新cargo.toml文件中的提及的库

    cargo doc --open 下载你本地使用的库文件对应的文档并用浏览器打开

    常量为什么不能是指定运行时才有返回值的呢,因为它要在编译的时候就将表达式的值计算出来,如果是运行时类的结果会报错,也是为了提高安全性

    shadowing的特性原因,是因为rust的变量默认是不可变的,当你第二次用let的时候,它之前的就消失了.也是为了安全性考虑,但是目前没看到为啥有这样做的必要,

    重新定义一个变量是最好的

    rust 整数默认类型为u32,无符号32位整型,浮点类型为u64,无符号64位浮点型

    rust move机制,复杂类型的数据同一时间只有一个人拥有,只有一个王,用完了之前的就不能再用了.会默认执行drop方法,回收内存.

    如果你想深度copy,那么就需要使用到clone方法.

    而整型等具在编译时就有确定大小的量是存在于栈内存中.

    reference的方式 &test_str 传递引用,而不传递所有权.可以方便函数中使用,也不会让函数调用drop函数,把当前变量清除.

    而reference的借用方式不能修改变量值,因为rust的变量默认是不可变的,如果需要修改,原先的变量需要增加mut的关键词,同时借用的引用也需要增加mut关键词.

    同时一个可变引用变量不能同时被两次借用,会报错的.

    use std::io;

    fn main() {

        //while_loop_test();

        let range_result:i32 = for_range_test(16,20);

        println!("the sum from 16 to 20 is: {}",range_result);

        string_test();

        let first_str =String::from("hello");

        take_ownership(first_str.clone());//String 是复杂类型,传递出去之后first_str的所有权就没有了,而如果使用clone,说明又复制了一份数据,原来的还可以用

        println!("{}",first_str);

        let test_str = give_ownership_in_fn();

        println!("{}",test_str);

        let origin_str = String::from("starknet is good ");

        let back_str = take_and_give_back(origin_str);

        println!(" back_str={} ",back_str);

        let test_str = String::from("BTC to the moon");

        let (test_str, length) = test_return_two_result(test_str);

        println!("test_str= {}, length={} ",test_str,length);

        let len = deliver_reference_test(&test_str);

        println!("The length of '{}' is {}.", test_str, len);

        let mut loot = String::from("loot realms");

        test_change_str_with_reference(&mut loot);

        println!("{}",loot);

        other_mut_reference_test();

        string_slice_test();

        let mut input_str = String::new();

        io::stdin().read_line(&mut input_str ).expect("Failed to read line");

        let first_word = get_first_word(&input_str);

        println!("the  first word is: {}",first_word);

    }

    fn get_first_word(s: &String) -> &str {

        let bytes = s.as_bytes();

        for (i, &item) in bytes.iter().enumerate(){

            if item == b' '{

                return &s[0..i];//如果碰到了第一个空格,那么就返回这个字符串的第一个单词

            }

        }

        return &s[..];

    }

    fn test_change_str_with_reference(s: &mut String){

        s.push_str(" to the moon");

    }

    fn test_return_two_result(s: String) -> (String, usize){

        let length = s.len();

        return (s, length);

    }

    fn deliver_reference_test(test_str: &String) -> usize{

        return test_str.len();

    }

    fn take_ownership(hello_str:String){

        println!("{}",hello_str);

    }

    fn take_and_give_back(hello_str:String) -> String {

        return hello_str;

    }

    fn give_ownership_in_fn() -> String{

        return String::from("hello");

    }

    fn input_number_test(){

        let mut input = String::new();

        println!("Please enter a number.");

        io::stdin().read_line(&mut input).expect("Failed to read line");

        let input: i32 = input.trim().parse().expect("Please type a number!");

        println!("You entered: {}", input);

    }

    fn input_array_index_test(){

        let mut first_input = String::new();//定义一个变量接收输入值

        println!("Please enter the first number:");//打印提示信息

        io::stdin().read_line(&mut first_input).expect("Failed to read line");//读取输入的值,并且做异常处理

        let first_input:i32 = first_input.trim().parse().expect("Please type a number!");//将输入的值转换成i32类型

        println!("Please enter the second number:");//打印提示信息

        let mut second_input = String::new();//读取第二个值

        io::stdin().read_line(&mut second_input).expect("Failed to read line");//读取输入的值并赋值给second变量,并且做异常处理

        let second_input:i32 = second_input.trim().parse().expect("Please type a number!");//将输入的值转换成i32类型

        let result:i32 = to_add(first_input,second_input);//调用to_add函数,并且将返回值赋值给result变量

        println!("The result is: {}",result);//打印结果

        if result /2 == 0 {

            println!("result is even");

        } else {

            println!("result is odd");

        }

    }

    fn print_labled_measurement(value:i32, unit_label: char){

        println!("the measurement is {value}, {unit_label} ");

    }

    fn to_add(x: i32, y:i32) -> i32{

        x+y //不能有分号,因为是一个表达式,不是一个语句,语句是需要有分号,这里加了分号要报错的.

    }

    fn for_loot_test(){

        let num_array = [10,20,30,40,50];

        for num in num_array {

            println!("the number is: {}",num);

        }

    }

    fn while_loop_test() {

        let mut number = 0;

        let mut sum = 0;

        while number <100 {

            sum += number;

            number += 1;

        }

        println!("the sum from 0 to {} is: {}",number,sum);

    }

    fn other_mut_reference_test(){

        let mut test_str = String::from("loot lords cc ");

        let first = &test_str;

        let second = &test_str;

        println!("{} and {}",first,second);

        let r3 = &mut test_str;

        println!("r3= {} ",r3);

    }

    fn for_range_test(start:i32, end :i32) -> i32{

        if start >= end {

            return 0;

        }

        let mut sum = 0;

        for number in start..end {

            sum += number;

        }

        return sum;

    }

    fn string_test(){

        let mut s = String::from("hello");

        s.push_str(", world!");

        println!("{}",s);

    }

    fn string_slice_test(){

        let s = String::from ("eth to the moon");

        let slice1 = &s[..4];

        println!("{}",slice1);

    }

    相关文章

      网友评论

          本文标题:20240229Rust学习笔记及代码02

          本文链接:https://www.haomeiwen.com/subject/yknxzdtx.html