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

}

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

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): 创建一个从 startend(不包括)的迭代器,也就是左闭右开的区间。
  2. RangeInclusive (start..=end): 创建一个从 startend(包括)的迭代器,闭区间,包含结束值。

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

三、

相关推荐
爱码小白7 分钟前
Python 异常处理 完整学习笔记
开发语言·python
c++之路22 分钟前
C++20概述
java·开发语言·c++20
Championship.23.2426 分钟前
Linux Top 命令族深度解析与实战指南
java·linux·服务器·top·linux调试
techdashen31 分钟前
Cloudflare 为何抛弃 NGINX,用 Rust 自研了一个代理
运维·nginx·rust
芝士就是力量啊 ೄ೨36 分钟前
Python如何编写一个简单的类
开发语言·python
橘子海全栈攻城狮41 分钟前
【最新源码】养老院系统管理A013
java·spring boot·后端·web安全·微信小程序
逻辑驱动的ken1 小时前
Java高频面试考点18
java·开发语言·数据库·算法·面试·职场和发展·哈希算法
MoonBit月兔1 小时前
「Why MoonBit 」第一期——Singularity Note AI 学习助手
开发语言·人工智能·moonbit
木木_王1 小时前
嵌入式Linux学习 | 数据结构 (Day05) 栈与队列详解(原理 + C 语言实现 + 实战实验 + 易错点剖析)
linux·c语言·开发语言·数据结构·笔记·学习
冷雨夜中漫步1 小时前
Claude Code源码分析——Claude Code Agent Loop 详细设计文档
java·开发语言·人工智能·ai