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

前言

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


         \;\\\;\\\;

目录

    • 前言
    • 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,  //255
        name : 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'; //shadowing
    println!("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=ok
    assert_eq!(EvenNumber::try_from(5), Err(()));           //err=err



    let a: Result<EvenNumber, ()> = 8i32.try_into();  //和a.into()的用法一样
    assert_eq!(a, Err(()));            //ok!=err
   
    let 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);
}

在这里插入图片描述

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/155745.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

华为eNSP综合实验考试

VLAN信息表 设备名称 端口 链路类型 VLAN 参数 HZ-HZCampus-Agg01-S5731 GE0/0/1 Trunk PVID:1 Allow-pass&#xff1a;10 20 Eth-trunk1&#xff08;GE0/0/2,0/0/3,0/0/23&#xff09; Trunk PVID:1 Allow-pass&#xff1a;10 20 GE0/0/24 Access PVID&#xf…

vb.net 实时监控双门双向门禁控制板源代码

本示例使用设备介绍&#xff1a;实时网络双门双向门禁控制板可二次编程控制网络继电器远程开关-淘宝网 (taobao.com) Imports System.Net.Sockets Imports System.Net Imports System.Text Imports System.ThreadingImports System.Net.NetworkInformation Imports System.Man…

Python函数进阶

函数进阶 一.函数多返回值二.函数多种传参方式三.匿名函数 一.函数多返回值 思考&#xff1a;如果一个函数有两个return&#xff0c;程序如下 只执行了一个return&#xff0c;原因是return可以退出当前函数&#xff0c;导致return下方代码不会执行 多个返回值 按照返回值的顺…

BananaPi BPI-M6(Raspberry Pi 5) Android 平板电脑镜像测试温度

我已经在本文中介绍了 全新的Banana Pi BPI-M6&#xff0c;并讨论了其与Raspberry Pi 5的硬件特性比较。 然后我将 Android 平板电脑固件上传到 eMMC&#xff0c;从而使 Banana Pi 实际可用。一开始有点坎坷&#xff0c;但文章中有更多内容。 在另一台电脑上&#xff0c;一切都…

Vatee万腾未来科技之航:Vatee创新引领的新纪元

在当今数字化时代&#xff0c;Vatee万腾科技正在开创一段引领未来的全新征程。以其卓越的创新能力和领导地位&#xff0c;Vatee万腾成为数字化领域的引领者。其未来科技之航展现了一种独特的数字化愿景&#xff0c;引领着科技创新进入新的纪元。 Vatee万腾在数字科技领域展现出…

如何使用功率信号源保证高精度测量

使用功率信号源是实现高精度测量的关键因素之一。在许多应用中&#xff0c;精确的功率信号源可以提供稳定、可靠的信号&#xff0c;帮助实现准确的测量结果。以下是使用功率信号源保证高精度测量的几个关键方面&#xff1a; 信号稳定性&#xff1a;在进行精确测量时&#xff0c…

热点检测/降级框架Akali的部分原理解析

发现个“轻量级本地化热点检测/降级框架 这个框架名为Akali,项目地址&#xff1a;https://gitee.com/bryan31/Akali主要有两个作用 1&#xff1a;热点检测及处理 2&#xff1a;降级检测及处理 从官网文档来看使用是比较简单的&#xff0c;一个注解就能搞定 怀着好奇的心情c…

光模块厂家如何提高千兆光模块和万兆光模块的可靠性

随着互联网的发展&#xff0c;光纤通信作为高速、稳定的通信方式越来越受到人们的关注。而千兆光模块和万兆光模块作为通信中必不可少的组成部分&#xff0c;其可靠性一直是厂家和用户所关注的重要问题。光模块的不可靠性会导致通信系统的故障和影响用户的体验&#xff0c;因此…

networkx使用draw画图报错:TypeError: ‘_AxesStack‘ object is not callable

一、问题描述 在使用networkx的draw绘图时nx.draw(g,posnx.spring_layout(g))&#xff0c;报错&#xff1a;TypeError: _AxesStack object is not callable 二、原因 可能是当前python环境下的networkx和matplotlib的版本不匹配。我报错时的networkx2.8&#xff0c;matplotl…

Element UI 偶发性图标乱码问题

1. 问题如图所示 2. 原因&#xff1a;sass版本低 sass: 1.26.8 sass-loader: 8.0.2 3. 解决方法 (1) 提高sass版本 (2) 在vue.config.js中添加配置 css: {loaderOptions: {sass: {sassOptions: {outputStyle: expanded}}}},4. 遇到的问题 升级后打包&#xff0c;报错 Syntax…

Freeswitch中mod_commonds

mod_commands Table of Contents (click to expand) 0. About1. Usage 1.1 CLI1.2 API/Event Interfaces1.3 Scripting Interfaces1.4 From the Dialplan2. Format of returned data3. Core Commands 3.1 acl  3.1.1 Syntax3.1.2 Examples3.2 alias 3.2.1 Syntax3.2.2…

VBA技术资料MF83:将Word文档批量另存为PDF文件

我给VBA的定义&#xff1a;VBA是个人小型自动化处理的有效工具。利用好了&#xff0c;可以大大提高自己的工作效率&#xff0c;而且可以提高数据的准确度。我的教程一共九套&#xff0c;分为初级、中级、高级三大部分。是对VBA的系统讲解&#xff0c;从简单的入门&#xff0c;到…

初始MySQL(六)(自增长,索引,事务,隔离级别)

目录 自增长 索引 索引的原理: mysql索引的类型 添加/删除索引/查看索引 添加索引 删除索引 查看索引(没有生成或者问问什么时候存在) 小结 MySQL事务 关于事务的一些概念 mysql数据库控制台事务的几个重要操作 MySQL事务细节讨论 MySQL事务隔离级别 介绍 数据库…

ElasticSearch 安装(单机版本)

文章目录 ElasticSearch 安装&#xff08;单机版本&#xff09;环境配置下载安装包调整系统参数安装启动并验证 ElasticSearch 安装&#xff08;单机版本&#xff09; 此文档演示 ElasticSearch 的单机版本在 CentOS 7 环境下的安装方式以及相关的配置。 环境配置 Linux 主机一…

Android 14 Beta 1

Android 14的第一个 Beta 版&#xff0c;围绕隐私、安全、性能、开发人员生产力和用户定制等核心主题构建&#xff0c;同时继续改进平板电脑、可折叠设备等大屏幕设备的体验。我们一直在完善 Android 14 的功能和稳定性方面取得稳步进展&#xff0c;现在是时候向开发者和早期采…

C++基础(3)——类与对象

1.构造函数&#xff1a; 1.1 构造函数的引入&#xff1a; 在关于数据结构这一部分的文章中&#xff0c;创建了一个新的数据结构后&#xff0c;通常需要编写一个初始化函数来对这个数据结构进行一次初始化。在C的类中&#xff0c;如果存在函数&#xff0c;同样也需要对函数进行…

传递函数的推导和理解

传递函数的推导和理解 假设有一个线性系统&#xff0c;在一般情况下&#xff0c;它的激励 x ( t ) x(t) x(t)与响应 y ( t ) y(t) y(t)所满足的的关系&#xff0c;可用下列微分方程来表示&#xff1a; a n y ( n ) a n − 1 y ( n − 1 ) a n − 2 y ( n − 2 ) ⋯ a 1 y…

【重点文章】服务升级惨痛教训

文章目录 事故解析:避免方法涉及知识 以前怎么接触过大表&#xff0c;所以alter操作我都是一次性执行好几条的&#xff0c;这几条一下子干过去了   结果就是一直在转圈执行&#xff0c;因为alter产生的是表级排它锁&#xff0c;所以有关这几个表的查询更新操作全部处于阻塞…

CTF-栈溢出-基本ROP-【ret2shellcode】

文章目录 ret2shellcodeHTBCyberSanta 2021 sleigh思路exp ret2shellcode 控制程序去执行我们自己填充的代码。 条件&#xff1a; 我们填充的代码的位置具有可执行权限 HTBCyberSanta 2021 sleigh 检查保护 Has RWX segments提示有可读可写可执行的段 main函数 banner函数…

教师资格证的照片是什么底色?一键替换证件照背景色

现在在报考教师资格证时&#xff0c;我们提交个人资料信息都是在网络上进行的&#xff0c;最关键的一步就是要提交证件照&#xff0c;很多小伙伴还都不太情书教师资格证证件照要求&#xff0c;比如规定的证件照背景色是什么颜色&#xff0c;今天就围绕着这个问题给大家详细说明…