济南建设网站的公司,wordpress模版安装,网站开发如何验证,网站模版如何建文章目录 变量可变与不可变变量变量与常量变量的Shadowing标量类型整数 复合类型 函数控制流if elseloop whilefor in structstruct的定义Tuple Structstruct的方法与函数 变量
可变与不可变变量
Rust中使用let来声明变量#xff0c;但是let声明的是不可变变量#x… 文章目录 变量可变与不可变变量变量与常量变量的Shadowing标量类型整数 复合类型 函数控制流if elseloop whilefor in structstruct的定义Tuple Structstruct的方法与函数 变量
可变与不可变变量
Rust中使用let来声明变量但是let声明的是不可变变量如果想要可变则需要加上mut关键字
fn main(){let x 10;x x 1; //报错因为x是不可变类型let mut y 11;y y 1; //可行
}变量与常量
常量与不可变变量一样都是不能被修改的但是他与不可变变量有很多区别。
常量用const声明且必须标注其类型常量不能加mut修饰常量可以在任何作用域内声明包括全局常量只可以绑定在常量表达式中无法绑定在函数的调用结果或者只能在运行时才能计算出的值。在场许运行期间长廊在其作用域内一直有效。
常量命名规范全大写字母下划线分割不符合规范rust编译器会警告
const MAX_POINT 10000;
fn main(){
}变量的Shadowing
Rust允许用户在一个作用域内重复的声明一个同名变量并且可以是不同的类型的而后声明的变量会覆盖前面声明的变量这叫做变量的shadowing
fn main(){let x 100;let x Test; // 此时在对x进行操作x的值就是Testlet number 123123;let number number.trim().parse(); //转化为数字//上述shadowing就使得通用一个number的变量名但是却做到了类型转换。
}标量类型
Rust是一个强类型的静态语言这意味着在编译时编译器就需要明确的知道每个变量的类型而不是像Py一样“变量的类型是动态可变的”。
而上述的代码没有指定类型只使用了let是因为Rust的编译器可以自行推断出变量的类型根据返回值上下文调用情况。而有时情况过于复杂时便无法推断便需要使用者自行标注出类型。
整数
整数类型如下 可以看到分类无符号和有符号类型并且每个类型都标清楚了占多少字节最后一个isize类型表示的是CPU位数长度的整数类型一个机器字长与电脑硬件有关。
如下面代码所示在变量后面加冒号在家类型就可以强制显示的的表明变量的类型。
fn main(){let x: i8 18;let y: u32 100;
}整数字面值如上 Rust允许在数字之间加下划线用于增加可读性。其中十六进制以0x开头八进制以0o开头二进制以0b开头。 而字节类型需要在字符串前加一个b。
Rust允许在数值后面加上类型来标注这个数字的类型
fn main(){let x 1002u32let y 10010010i32let z 0b100100let a 0xffa0let b bB
}Rust的int默认值是32浮点数默认值是64Bytes。如果整数类型发生了溢出那么程序就会panic如果在发布模式下编译则不会检查溢出。Rust的溢出会进行环绕操作即对可取的最大值取余。 布尔类型则是有两个值一个是true一个是false占两个字节
fn main(){let x: bool true;
}字符类型用来描述语言中最基础的单个字符占四个字节使用的值是Unicode表值。
fn main(){let x: char 你;let u: char ;
}复合类型
Rust提供了两种复合类型一个是Tuple一种是数组。 Tuple的创建遵循以下规则
fn main(){let x: (i32, char, f32) (2003, a, 0.3);println!({} {} {}, x.0, x.1, x.2);
}对于元组可以使用点索引的形式来得到元素元组是定长的你可以认为它类似于C的struct的简化版。
元组还可以进行拆包其过程如下
fn main(){let x: (i32, char, f32) (2003, a, 0.3);let (a, b, c ) x;
}另一个数据类型数组则是定长且使用[]来进行定义和创建
fn main(){let x: [i32; 5] [1, 2, 3, 4, 5]; // 创建一个i32类型长度为5的数组let y [5; 4];// 创建4个i32类型值为5长度为4的数组let z [xxx, yyy]; //创建两个str类型的数组
}上述需要注意的是let y [5; 4];这种写法相当于是创建一个重复为5长度为4的数组
函数
rust的函数的格式为
fn 函数名(参数: 类型) - 返回值{函数体;
}fn main(){let x test();
}fn test(){println!(Test);
}上述的test的返回值是()。
fn main(){let _x test(32);
}fn test(number: i32) - (){println!(Test number is {}, number);
}Rust的函数体由Statement和Expression来构成其中Statement指的是像let x 10;这类的语句而Expression则是x 3, x 5这样具有返回值的表达式。
Rust默认最后一个表达式即为返回值或者函数题的值如果没有则默认值为()
fn main(){let x test(10);println!(Test number is {}, x);
}fn test(number: i32) - i32{5 number //注意5 number后面没有分号否则将会被视为一个语句
}这个函数体还可以作为变量的值来传递
fn main(){let x {let mut _y 11;_y * 3};println!({}, x)
}上述x的的值是33如果函数体最后一个语句没有返回值则会得到()
控制流
与Rust控制流相关的有loopwhilefor in的循环语句和if elsematch的判断语句。其中match涉及到枚举不在这里记录放在枚举那里。
if else
if和else就类似于C语言当只有一个单独的语句时可以不用最外层的括号
fn main(){let x 10;if x 5 {println!(大于5);}else if x 5 {println!(小于5);}else {println!(小于5);}
}三元运算符有点类似于python与C的结合体例子如下 if 条件 {结果1} else {结果2} fn main(){let x if 5 3 {5} else {3};println!(x is {}, x);let y if x ! 5 {x * 2}else{x - 3};println!(y is {}, y);
}
/*Compiling hello_world v0.1.0 (E:\RustProject\Hello_World)Finished dev [unoptimized debuginfo] target(s) in 0.69sRunning target\debug\hello_world.exe
x is 5
y is 2
*/loop while
loop的用法就是相当于while true也就是loop内的语句会被不停地循环直到遇到break为止。 用法如下
fn main(){let mut x 0;loop{x 1;if x 10{break;}}println!(x is {}, x);
}而对于while循环则是和C和Py一样break和continue语句也是同样的道理。 while 条件{} fn main(){let mut x 0;while x 10 {x 1;}println!(x is {}, x);
}for in
for in则是类似于py的for in集合的模式in后面需要跟一个可以迭代的类型例如数组。 需要注意的是此时tmp是i32类型也就是说它的类型是确定的没法for in一个多种类型的Tuple。
fn main(){let x [3, 4, 5, 6];for tmp in x.iter(){ //iter方法得到x的迭代器println!({}, tmp);}
}
/*Compiling hello_world v0.1.0 (E:\RustProject\Hello_World)Finished dev [unoptimized debuginfo] target(s) in 1.07sRunning target\debug\hello_world.exe
3
4
5
6
*/对于计数之类的需求Rust提供了Range的方法可以使用a…b来构造一个a1,a2…, b-2, b-1的序列来进行遍历如下
fn main(){for x in 3..10{println!({}, x);}
}
/*Compiling hello_world v0.1.0 (E:\RustProject\Hello_World)Finished dev [unoptimized debuginfo] target(s) in 1.03sRunning target\debug\hello_world.exe
3
4
5
6
7
8
9
*/struct
struct的定义
Rust的struct定义如下 struct 名称{ 变量1: 类型, 变量2: 类型… } struct Rectangle{width: u32,length: u32
}而struct的初始化则是使用名字变量名:值的形式初始化注意struct不允许有字段为空值也就是说需要全部值都初始化 let re Rectangle{width: 10,length: 19};而这些值的访问就类似于C的struct直接用点对应的字段即可。
struct也可以设置为mut而对于struct来说一旦设置为mut则里面每个值都必须要是mut也就是说都是可变的。 let mut re Rectangle{width: 10,length: 19};re.width 100;当有变量名与struct内部定义的变量名同名时可以省去冒号进行初始化
struct Rectangle{width: u32,length: u32
}fn main(){let width 9;let mut re Rectangle{width, // 省去了冒号因为width同名length: 19};
}当想要对struct进行更新时有一种简单的简写操作如下 let width 9;let mut re Rectangle{width, length: 19};let re2 Rectangle{width: 100,..re //re表示剩下的字段的值与re的剩余字段的值相同};Tuple Struct struct的方法与函数
对于一个struct它拥有对应的方法和函数而对于方法则是应用于struct的上下文中的可以获取和修改具体的struct的值。而函数则不能他只是与某种struct关联到了一起而已。 使用impel关键字来为struct绑定方法和函数。 第一个参数带有self关键字就是方法而不带有则是函数 struct Rectancle{width: u32,length: u32,
}impl Rectancle {//为Rectangle绑定函数和方法fn area(self) - u32{//绑定一个方法self表示Rectangle结构体本身self.width * self.length //返回面积}
}fn main(){let y Rectancle{width: 10,length: 15};println!(Area is {}, y.area());
}下面是绑定一个函数例子
struct Rectancle{width: u32,length: u32,
}impl Rectancle {fn area(self) - u32{self.width * self.length}fn make_square(size: u32) - Rectancle { //构造一个正方形Rectancle { width: (size), length: (size) }}
}fn main(){let sq Rectancle:: make_square(10);//通过使用::的方式来调用函数println!(Area is {}, sq.area());
}需要注意每个struct允许拥有多个impel的模块。