rust练习(待完成....)

一、变量

1.变量的作用域
fn main() {
    let x: i32 = 10;
    let y:i32=1;
    {
        let y: i32 = 5; //在这个作用域发生了 变量的遮盖(重影):遮盖了前面定义的变量y。值和类型都可以变,这里的y和前面的y不是同一个。
        println!("x 的值是 {}, y 的值是 {}", x, y);
    }
    println!("x 的值是 {}, y 的值是 {}", x, y); 
}

注:作用域 (空间)和 生命周期(针对引用,时间上):

2.

fn main() {
    println!("{}, world", define_x()); 
}

Rust会在上存储 String 对象。 这个对象里包含以下三个信息: 一个 指针 指向一块分配在堆上的缓冲区,这也是数据真正存储的地方,数据的 容量 和 长度 。

fn define_x() ->String{ //在栈上
    let x = String::from("hello");
    x
}

为什么错:

fn main() {
    println!("{}, world", define_x());  //产生悬垂引用
}

//返回类型是一个引用,分配在堆上,离开函数范围失效,

fn define_x() ->&str{
    let x = "hello";//x: &str类型
    x
}

作用域的在函数中的传递:所有权。堆中的数据:作用域会在函数传递;栈中数据:会复制一份x_copy。

3.解构:

4.0 38_u8 代表38是 u8

fn main() {
    let v: u16 = 38_u8 as u16;
}
//在这个转换过程中需要使用”as“关键字来指示类型转换。由于 u16 比 u8 更宽,因此在转换时不会发生数据丢失。

4.1自动推导类型

移除x声明的类型,编译器会根据上下文定义类型为u32
fn main() {
    let x: i32 = 5;
    let mut y: u32 = 5;

    y = x;

    let z = 10; // 这里 z 的类型是? 
}

二、基本类型

1.整形

有符号 正负 【-128,127】  ;无符号 只有正 2的8次方-1 = 256
给相应类型赋值:不能值越界

fn main() {
    assert_eq!(i8::MAX, __); 
    assert_eq!(u8::MAX, __); 
}
fn main() {
    assert_eq!(i8::MAX, 127); 
    assert_eq!(u8::MAX, 255); 
}

2.浮点型 f32、f64.默认f64


fn main() {
    assert!(0.1+0.2==0.3);//assert!(0.1_f32+0.2_f32==0.3_f32); 为什么f64会报错
}

3序列:range。
Rust 内置的范围类型,包括 左闭右开 和 全币 两种区间。

在 Rust 中,Range 是一种迭代器类型,它生成一系列按顺序排列的数字。Range 通常用于 for 循环中,提供了一种简便的方式来执行重复操作一定次数的任务。

这里有两种最常用的 Range 类型:

  1. Range (start..end): 创建一个从 start 到 end(不包括)的迭代器,也就是左闭右开的区间。
  2. RangeInclusive (start..=end): 创建一个从 start 到 end(包括)的迭代器,闭区间,包含结束值。

fn main() {
    let mut sum = 0;
    for i in -3..2 {  //包前不包后
        sum += i 
    }

    assert!(sum == -5);

    for c in 'a'..='z' {
        println!("{}",c as u8); //强制类型转化
    }

4.计算

fn main() {
    assert!(1u32 + 2 == 3);

    assert!(1i32 - 2 == -1);
    assert!(1i8 - 2 == -1);

    assert!(3 * 50 == 150);

    assert!(9 / 3 == 3); 

    assert!(24 % 5 == 4);
    assert!(true && false == false);
    assert!(true || false == true);
    assert!(!true == false);

    println!("0011 AND 0101 is {:04b}", 0b0011u32 & 0b0101);
    println!("0011 OR 0101 is {:04b}", 0b0011u32 | 0b0101);
    println!("0011 XOR 0101 is {:04b}", 0b0011u32 ^ 0b0101);
    println!("1 << 5 is {}", 1u32 << 5);
    println!("0x80 >> 2 is 0x{:x}", 0x80u32 >> 2);
}

三、

相关推荐

  1. rust练习完成....)

    2024-04-20 16:30:01       36 阅读
  2. RocketMq实战(完善)

    2024-04-20 16:30:01       55 阅读
  3. 学习redis(完善

    2024-04-20 16:30:01       54 阅读
  4. Zookeeprt实战(完善)

    2024-04-20 16:30:01       47 阅读
  5. deepspeed chat RLHF 个人笔记(完成

    2024-04-20 16:30:01       41 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-04-20 16:30:01       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-04-20 16:30:01       100 阅读
  3. 在Django里面运行非项目文件

    2024-04-20 16:30:01       82 阅读
  4. Python语言-面向对象

    2024-04-20 16:30:01       91 阅读

热门阅读

  1. Spark面试整理-解释Spark中的广播变量和累加器

    2024-04-20 16:30:01       34 阅读
  2. 安全运维资料

    2024-04-20 16:30:01       32 阅读
  3. 【架构-15】NoSQL数据库

    2024-04-20 16:30:01       31 阅读
  4. Spring Cloud 面试题(一)

    2024-04-20 16:30:01       31 阅读
  5. 代码随想录 day44 第九章 动态规划 part06

    2024-04-20 16:30:01       35 阅读
  6. Spring框架中的11种设计模式(设计模式之美)

    2024-04-20 16:30:01       34 阅读
  7. 【LeetCode热题100】【贪心算法】划分字母区间

    2024-04-20 16:30:01       33 阅读