20240229Rust学习笔记及代码02

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);

}

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,884评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,347评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,435评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,509评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,611评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,837评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,987评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,730评论 0 267
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,194评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,525评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,664评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,334评论 4 330
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,944评论 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,764评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,997评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,389评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,554评论 2 349

推荐阅读更多精彩内容