当前位置: 首页 > news >正文

2023-11-Rust

学习方案:Rust程序设计指南

1、变量和可变性

声明变量:let 变量、const 常量

rust 默认变量一旦声明,就不可变(immutable)。当想改变 加 mut(mutable) 。

const 不允许用mut ,只能声明常量,单词全部大写下划线连接。

let特点:

可多次声明,多次声明隐蔽性、默认不可变。

mut 和隐蔽的区别:

隐蔽实际创建一个新的变量,可以改变值得类型,并复用变量名。而mut 修改值时不能转换值得类型

2、rust类型

标量 scalar:

rust有四种标量类型:整数、浮点型、bool、字符型

整型:长度为 8-128bit、arch(isize、usize)、有符号 ixxx 、无符号u***

有符号和无符号代表数字是否可为负值(有符号数)、

或永远为正(无符号数)、

isize和usize 类型依赖运行程序的计算机架构,64系统为64,32系统为32

rust 默认使用 i32 。

整形溢出:

debug模式:程序panic

release模式:二进制补码,超过最大值绕会最小值

浮点型: f32  f64 默认 f64 。32单精度,64双精度。

字符类型 char:

单引号 声明char 字面量

双引号声明 字符串字面量

复合类型 compound:

rust有两个原生的复合类型:tuple 、array  

tuple 元祖:一旦声明,长度不可变。每个位置类型可不同,可以结构,可以使用点访问索引  

数组:长度固定,类型一致, 

声明12个长度 类型为i32的数组:let x :[i32;12]=[]

创建x个值为y的数组 let arr = [x;y];

访问元素:【index】,索引超出数组时panic

函数:

函数名变量名 snake case 风格;小写下划线分割,函数签名提供参数类型。

语句和表达式

语句:不返回值,

表达式:计算产生一个值

表达式可以用变量接收,语句不能用变量接收。

rust 函数也是语句

2、所有权

及scope 作用域:

栈:

堆:

Sting:

指针:0x1111

长度:当前String使用多少字节内存,

容量:String从分配器总共获取多少字节内容。 

栈:出作用域自动调用 drop函数

堆:存在指针拷贝。可能存在重复drop,二次释放【bug】造成内存污染,安全隐患。

解决:指针拷贝后,rust认为指针一不再有效,

 let str = String::from("hello world");let str1 = str;println!("str is {str}")

【 str  value borrowed here  after move  】

js: 深拷贝、浅拷贝。

rust: move 移动

rust 深拷贝的方式 clone,重新拷贝了一份堆中数据。

【js 和 rust 关于堆数据多次引用的关系区别】:

js:多个指针指向同一个堆中数据

rust:当多个指针指向同一个堆中数据,只有最后一个指针有效,之前的全部失效,无法访问

包括 函数的实参传递。

fn test2(){let str = String::from("hello world");test3(str);println!("str is {str}") // str value borrowed after move
}fn test3(str:String){}

rust变量:栈中copy 

 let x = 111;let y = x;println!("x is {x}")  //111

弊端:不获取所有权就无法对堆数据进行访问,引出:

【reference  引用 &】

引用与指针:

引用确保指向某个堆数据的有效指针。

移动:

引用:

fn test2(){let str = String::from("hello world");test3(&str);println!("str is {str}") // hello world
}fn test3(str:&String){}

tip:

函数使用引用值作为参数,无需交换所有权,因为未曾拥有过。

将创建一个引用的行为成为借用【borrowing】,使用权而不是拥有权和处置权。

所以无法修改借用来的变量:

  fn test3(str:&String){str.push_str("8888") ;}
// error:  cannot borrow `*str` as mutable, as it is behind a `&` reference

引用同变量一样,默认不允许修改。

引出: 可变引用:

fn test2(){let str = String::from("hello world");test3(&mut str);println!("str is {str}") // hello world
}fn test3(str:&mut String){}

限制:

只能对同一个变量使用一次可变引用,因为无法清除以哪个结果为准,数据在运行时难以追踪,类式:同时append和remove同一个dom。

【数据竞争】:多个指针同时访问并异步同一数据源

在同时使用可变与不可变引用是也是类式的规则。

let str = String::from("hello world");let str1 = &str;let str2 = &mut str1; // cannot borrow `str1` as mutable, as it is not declared as mutable

一个引用的作用域从声明的地方一直持续到最后一次使用为止,如果最后一个使用不可变引用发生在可变引用之前,那么是可以的:

 let mut str = String::from("hello world");let str1 = &str;let str2 = &mut str;//error:cannot borrow `str` as mutable because it is also borrowed as immutableprintln!("str1 is {str1}");let str2 = &mut str;//ok

相关文章:

2023-11-Rust

学习方案:Rust程序设计指南 1、变量和可变性 声明变量:let 变量、const 常量 rust 默认变量一旦声明,就不可变(immutable)。当想改变 加 mut(mutable) 。 const 不允许用mut ,只能声明常量,…...

iOS代码混淆----自动

先大致解释一下“编译"、"反编译": 编译:就是把千千万万行字符串(也叫代码,或者源文件),变成010101010101(机器码,也叫目标代码) 编译过程:预处理-编译-汇编-链接 我的脚本运行在预处理阶段。 反编…...

对Mysql和应用微服务做TPS压力测试

1.对Mysql 使用工具:mysqlslap工具 使用命令: mysqlslap -uroot pGG8697000!#--auto generate sql -auto generate sql-load typemixed-concurrency100,200 - number of queries1000-iterations10 - number-int-cols7 - number-charcols13auto genera…...

将程序添加至右键菜单

将程序添加至右键菜单 手动导入 如果要将cmder添加至右键菜单。可以通过编写reg注册表方式添加 也可以在路径HKEY_CLASSES_ROOT\Directory\Background\shell中右击添加 创建项commadn 编写reg注册表 [HKEY_CLASSES_ROOT\Directory\Background\shell\cmder]为注册表地址 Wi…...

三板斧的使用、全局配置文件、静态文件的配置、orm介绍

三板斧的使用 【1】HttpResponse 返回字符串类型 【2】render 返回html页面,并且在返回给浏览器之前还可以给html页面传值 【3】redirect 重定向页面 视图函数必须返回一个 HttpResponse 对象 def index(request):print(request)# return HttpResponse("r…...

【编程实践】黑框框里的打字小游戏,但是汇编语言

开始: 在学习王爽的《汇编语言》的过程中,我就真切地体会到编程实践对于理解的帮助。起初我没有安装书中的实验环境,看到100页左右就开始感觉无趣、吃力,看了后面忘前面,差点就要放弃这本书的学习。好在我后来还是装好…...

ElasticSearch的集群、节点、索引、分片和副本

Elasticsearch是面向文档型数据库,一条数据在这里就是一个文档。为了方便大家理解,我们将Elasticsearch里存储文档数据和关系型数据库MySQL存储数据的概念进行一个类比 ES里的Index可以看做一个库,而Types相当于表,Documents则相当…...

std::cout无法打印uint8_t类型的数据

std::cout在处理uint8_t变量类型的时候默认输出字符&#xff0c;刚好数字0-10对应的ascii字符都是不可打印的 解决&#xff1a; 使用static_cast std::cout << static_cast<int>(time) << std::endl;参考文章&#xff1a;https://blog.csdn.net/weixin_459…...

浅谈泛在电力物联网在智能配电系统应用

贾丽丽 安科瑞电气股份有限公司 上海嘉定 201801 摘要&#xff1a;在社会经济和科学技术不断发展中&#xff0c;配电网实现了角色转变&#xff0c;传统的单向供电服务形式已经被双向能流服务形式取代&#xff0c;社会多样化的用电需求也得以有效满足。随着物联网技术的发展&am…...

已解决:云原生领域的超时挂载Bug — Kubernetes深度剖析

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…...

概念解析 | 高光谱图像:揭开自然世界的神秘面纱

注1:本文系“概念解析”系列之一,致力于简洁清晰地解释、辨析复杂而专业的概念。本次辨析的概念是:高光谱图像 高光谱图像:揭开自然世界的神秘面纱 Hyperspectral imaging - Wikipedia 背景介绍 我们生活的世界充满了丰富多彩的颜色。这些颜色来源于各种物体反射或吸收不同波长…...

Java类和对象(1)

&#x1f435;本篇文章将会开始对类和对象的第一部分讲解 一、简单描述类和对象 对象可以理解为一个实体&#xff0c;在现实生活中&#xff0c;比如在创建一个建筑之前&#xff0c;要先有一个蓝图&#xff0c;这个蓝图用来描述这个建筑的各种属性&#xff1b;此时蓝图就是类&a…...

百度上海智能研发中心一面

Prometheus告警机制原理 介绍hashmap和concurrentHashmap concurrentHashmap和hashmap如果线程1在遍历 另一个线程对这个map进行修改操作 会发生什么现象 对线程安全的理解 通过什么方法解决线程安全 除了上锁 CAS等还有其他手段 不用锁的话 &#xff08;集合的类设计成一…...

硝烟后的茶歇 | 中睿天下谈攻防演练之邮件攻击溯源实战分享

近日&#xff0c;由中国信息协会信息安全专业委员会、深圳市CIO协会、PCSA安全能力者联盟主办的《硝烟后的茶歇广东站》主题故事会在深圳成功召开。活动已连续举办四年四期&#xff0c;共性智慧逐步形成《年度红蓝攻防系列全景图》、《三化六防“挂图作战”》等共性研究重要成果…...

Leetcode Hot 100之四:283. 移动零+11. 盛最多水的容器

283.移动零 题目&#xff1a; 给定一个数组 nums&#xff0c;编写一个函数将所有 0 移动到数组的末尾&#xff0c;同时保持非零元素的相对顺序。 请注意 &#xff0c;必须在不复制数组的情况下原地对数组进行操作。 示例 1: 输入: nums [0,1,0,3,12] 输出: [1,3,12,0,0] …...

景联文科技助力金融机构强化身份验证,提供高质量人像采集服务

随着社会的数字化和智能化进程的加速&#xff0c;人像采集在金融机构身份认证领域中发挥重要作用&#xff0c;为人们的生活带来更多便利和安全保障。 金融机构在身份验证上的痛点主要包括以下方面&#xff1a; 身份盗用和欺诈风险&#xff1a;传统身份验证方式可能存在漏洞&am…...

Spring Cloud LoadBalancer基础知识

LoadBalancer 概念常见的负载均衡策略使用随机选择的负载均衡策略创建随机选择负载均衡器配置 Nacos 权重负载均衡器创建 Nacos 负载均衡器配置 自定义负载均衡器(根据IP哈希策略选择)创建自定义负载均衡器封装自定义负载均衡器配置 缓存 概念 LoadBalancer(负载均衡器)是一种…...

剖析WPF模板机制的内部实现

剖析WPF模板机制的内部实现 众所周知&#xff0c;在WPF框架中&#xff0c;Visual类是可以提供渲染&#xff08;render&#xff09;支持的最顶层的类&#xff0c;所有可视化元素&#xff08;包括UIElement、FrameworkElment、Control等&#xff09;都直接或间接继承自Visual类。…...

计算机网络常见的名词解释

计算机网络常见的名词解释 1.应用层2.传输层3. 网络层4.链路层5. 无线网络和移动网络6.计算机网络中的安全 1.应用层 API &#xff08;Application Programming Interface&#xff09;应用程序编程接口HTTP &#xff08;Hyper Text Transfer Protocol&#xff09; 超文本传输协…...

Android Studio导入,删除第三方库

Android项目经常用到无私的程序员们提供的第三方类库。本篇博客就是实现第三方库的导入和删除。 一、导入第三方库 1、将需要的库下载到本地&#xff1b; 2、新建Moudle (1)File --- New Moudle (2)选择Android Library --- Next (3)填写Moudle名 --- Finish。一个新的Mou…...

基于距离变化能量开销动态调整的WSN低功耗拓扑控制开销算法matlab仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.算法仿真参数 5.算法理论概述 6.参考文献 7.完整程序 1.程序功能描述 通过动态调整节点通信的能量开销&#xff0c;平衡网络负载&#xff0c;延长WSN生命周期。具体通过建立基于距离的能量消耗模型&am…...

DockerHub与私有镜像仓库在容器化中的应用与管理

哈喽&#xff0c;大家好&#xff0c;我是左手python&#xff01; Docker Hub的应用与管理 Docker Hub的基本概念与使用方法 Docker Hub是Docker官方提供的一个公共镜像仓库&#xff0c;用户可以在其中找到各种操作系统、软件和应用的镜像。开发者可以通过Docker Hub轻松获取所…...

关于nvm与node.js

1 安装nvm 安装过程中手动修改 nvm的安装路径&#xff0c; 以及修改 通过nvm安装node后正在使用的node的存放目录【这句话可能难以理解&#xff0c;但接着往下看你就了然了】 2 修改nvm中settings.txt文件配置 nvm安装成功后&#xff0c;通常在该文件中会出现以下配置&…...

LeetCode - 394. 字符串解码

题目 394. 字符串解码 - 力扣&#xff08;LeetCode&#xff09; 思路 使用两个栈&#xff1a;一个存储重复次数&#xff0c;一个存储字符串 遍历输入字符串&#xff1a; 数字处理&#xff1a;遇到数字时&#xff0c;累积计算重复次数左括号处理&#xff1a;保存当前状态&a…...

MODBUS TCP转CANopen 技术赋能高效协同作业

在现代工业自动化领域&#xff0c;MODBUS TCP和CANopen两种通讯协议因其稳定性和高效性被广泛应用于各种设备和系统中。而随着科技的不断进步&#xff0c;这两种通讯协议也正在被逐步融合&#xff0c;形成了一种新型的通讯方式——开疆智能MODBUS TCP转CANopen网关KJ-TCPC-CANP…...

selenium学习实战【Python爬虫】

selenium学习实战【Python爬虫】 文章目录 selenium学习实战【Python爬虫】一、声明二、学习目标三、安装依赖3.1 安装selenium库3.2 安装浏览器驱动3.2.1 查看Edge版本3.2.2 驱动安装 四、代码讲解4.1 配置浏览器4.2 加载更多4.3 寻找内容4.4 完整代码 五、报告文件爬取5.1 提…...

Element Plus 表单(el-form)中关于正整数输入的校验规则

目录 1 单个正整数输入1.1 模板1.2 校验规则 2 两个正整数输入&#xff08;联动&#xff09;2.1 模板2.2 校验规则2.3 CSS 1 单个正整数输入 1.1 模板 <el-formref"formRef":model"formData":rules"formRules"label-width"150px"…...

DeepSeek 技术赋能无人农场协同作业:用 AI 重构农田管理 “神经网”

目录 一、引言二、DeepSeek 技术大揭秘2.1 核心架构解析2.2 关键技术剖析 三、智能农业无人农场协同作业现状3.1 发展现状概述3.2 协同作业模式介绍 四、DeepSeek 的 “农场奇妙游”4.1 数据处理与分析4.2 作物生长监测与预测4.3 病虫害防治4.4 农机协同作业调度 五、实际案例大…...

rnn判断string中第一次出现a的下标

# coding:utf8 import torch import torch.nn as nn import numpy as np import random import json""" 基于pytorch的网络编写 实现一个RNN网络完成多分类任务 判断字符 a 第一次出现在字符串中的位置 """class TorchModel(nn.Module):def __in…...

Go 并发编程基础:通道(Channel)的使用

在 Go 中&#xff0c;Channel 是 Goroutine 之间通信的核心机制。它提供了一个线程安全的通信方式&#xff0c;用于在多个 Goroutine 之间传递数据&#xff0c;从而实现高效的并发编程。 本章将介绍 Channel 的基本概念、用法、缓冲、关闭机制以及 select 的使用。 一、Channel…...