当前位置:首页 > 编程笔记 > 正文
已解决

【Rust】快速教程——冻结表达式

来自网友在路上 187887提问 提问时间:2023-11-19 14:55:13阅读次数: 87

最佳答案 问答题库878位专家为你答疑解惑

前言

以前谁是魔我杀谁,现在我杀谁谁就是魔。——《拔魔》


\;\\\;\\\;

目录

    • 前言
    • Rust基本知识
      • 结构体
      • 元组+结构体
      • 局部作用域
      • 冻结
      • 字面量
      • Vec元素的类型由第一个push进的类型确定
      • type别名
      • from和into
      • TryFrom和TryInto
    • 表达式

Rust基本知识

结构体

#[derive(Debug)]
struct Window_table{width : i32,height : i32,position : (i32,i32),id : i32,name :String,
}fn main(){let W=1920;let H=1080;let a = Window_table{width : 960,height : 600,position : (W/2-480,H/2-300),id : 0x0000_0000_0000_00ff,  //255name : String::from("new win")};println!("{:#?}",a);
}

在这里插入图片描述

元组+结构体

struct Color(u8,u8,u8); //3个字节
struct Point(f64,f64);  //16个字节fn main(){let a=Color(166,70,70);println!("a=({},{},{})",a.0,a.1,a.2);let a=Point(400.0,300.0);println!("a=({},{})",a.0,a.1);
}

在这里插入图片描述

局部作用域

目前这个例子还是和其他的语言一样,没什么特殊的。

fn main() {let a = 1;{let b = 2;println!("b={}", b);let a = 5_f32;println!("a={}", a);}println!("a={}", a);let a = 'a'; //shadowingprintln!("a={}", a);
}

在这里插入图片描述

冻结

fn main() {let mut a = 7i32;{let a = a;//a = 50; //报错,因为外部可变的a被内部不可变的a冻结了!}a = 3;
}

字面量

对于没有表明类型的整数,编译器默认是i32;对于没有表明类型的浮点数,编译器默认是f64

fn main() {let x = 117u8;let y = 20u32;let z = 3.1f32;let i = 5;let f = 3.1415;println!("size of `x` in bytes: {}", std::mem::size_of_val(&x));println!("size of `y` in bytes: {}", std::mem::size_of_val(&y));println!("size of `z` in bytes: {}", std::mem::size_of_val(&z));println!("size of `i` in bytes: {}", std::mem::size_of_val(&i));println!("size of `f` in bytes: {}", std::mem::size_of_val(&f));
}

在这里插入图片描述

Vec元素的类型由第一个push进的类型确定

fn main() {let a = 5u8;let b=String::from("Hello");let c:u8 = 1;let mut v = Vec::new();v.push(a);//v.push(b); //错误,因为类型被确定成u8了v.push(c);println!("{:?}", v);
}

在这里插入图片描述

type别名

//别名用type
type T1 = u64;
type T2 = u64;
type u8_ = u64;fn main() {let a: T1 = 5 as u8_;let b: T2 = 2 as u8_;println!("{} a + {} b = {} unit?", a, b, a + b);
}

在这里插入图片描述

from和into

from函数就是把传入类型转换成自定义的类型,通过是把传入数据赋值给自定义类型的属性

use std::convert::From;#[derive(Debug)]
struct Number {value: i32,
}impl From<i32> for Number {fn from(item: i32) -> Self {Number { value: item }}
}fn main() {let num = Number::from(30);println!("num={:?}", num);let a = 5;let b: Number = a.into();println!("b={:?}", b);
}

在这里插入图片描述

TryFrom和TryInto

和from、into一样,但是带错误处理

use std::convert::TryFrom;
use std::convert::TryInto;#[derive(Debug, PartialEq)]
struct EvenNumber(i32);impl TryFrom<i32> for EvenNumber {type Error = ();fn try_from(value: i32) -> Result<Self, Self::Error> {if value % 2 == 0 {Ok(EvenNumber(value))  //传入偶数就返回自定义类型} else {Err(())  //传入奇数就报错}}
}fn main() {assert_eq!(EvenNumber::try_from(8), Ok(EvenNumber(8))); //ok=okassert_eq!(EvenNumber::try_from(5), Err(()));           //err=errlet a: Result<EvenNumber, ()> = 8i32.try_into();  //和a.into()的用法一样assert_eq!(a, Err(()));            //ok!=errlet a: Result<EvenNumber, ()> = 5i32.try_into();assert_eq!(a, Err(()));            //err=err
}

在这里插入图片描述

\;\\\;\\\;

表达式

fn main() {let x = 5u32;let y = {let a = x * x;let b = a * x;//返回值不需要分号,意味着最后一句的结果默认是外面接收的b + a + x};let z = {   2 * x;};println!("x is {:?}", x);println!("y is {:?}", y);println!("z is {:?}", z);
}

在这里插入图片描述

表达式最后一句加了分号就表示没有返回值
在这里插入图片描述

查看全文

99%的人还看了

猜你感兴趣

版权申明

本文"【Rust】快速教程——冻结表达式":http://eshow365.cn/6-39380-0.html 内容来自互联网,请自行判断内容的正确性。如有侵权请联系我们,立即删除!