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

学做网站需要懂什么软件免费推广网站排名

学做网站需要懂什么软件,免费推广网站排名,做新媒体文的网站,广告游戏目录 一、概念二、Box\<T\>2.1 概念与应用场景2.2 简单应用2.3 递归类型的创建 三、通过Deref trait将智能指针当作常规引用处理3.1 常规引用3.2 像引用一样使用Box\<T\>3.3 自定义智能指针3.4 函数和方法的隐式解引用强制转换3.5 解引用强制转换与可变性交互 四、…

目录

  • 一、概念
  • 二、Box\<T\>
    • 2.1 概念与应用场景
    • 2.2 简单应用
    • 2.3 递归类型的创建
  • 三、通过Deref trait将智能指针当作常规引用处理
    • 3.1 常规引用
    • 3.2 像引用一样使用Box\<T\>
    • 3.3 自定义智能指针
    • 3.4 函数和方法的隐式解引用强制转换
    • 3.5 解引用强制转换与可变性交互
  • 四、使用Drop Trait清理代码
    • 4.1 自动运行
    • 4.2 手动丢弃

一、概念

  • 在Rust中,引用是只是借用数据的指针,智能指针拥有它们所指向的数据的所有权;
  • 智能指针通常使用结构体实现;
  • 智能指针实现了Deref trait,值可以被当作引用对待;
  • 智能指针实现了Drop trait,当值离开作用域时,其所指向的堆数据也去被清除;
  • 常用的智能指针见下表
指针功能说明
Box<T>用于在堆上分配值,允许在编译时执行不可变或可变借用检查
Rc<T>一个引用计数类型,相同数据可以有多个所有者,仅允许在编译时执行不可变借用检查
RefCell<T>允许在运行时执行不可变或可变借用检查;可以在即使RefCell<T> 自身是不可变的情况下修改其内部的值
Ref<T>RefMut<T>通过RefCell<T> 访问
  • 内部可变性模式:在不可变值内部改变值;

二、Box<T>

2.1 概念与应用场景

  • box是最简单最直接的智能指针,其类型是box<T>
  • box主要应用于以下场景:
    • 编译时未知大小的类型,但使用时却需要知道它的确切大小;
    • 大量数据且希望在确保数据不被拷贝的情况下转移所有权;
    • 只关心值的类型是否实现了特定 trait;

2.2 简单应用

fn main(){let b = Box::new(5);println!("b = {}", b);
}
  • 变量b指向了分配在上的值为5的Box;
  • b拥有这块内存的所有权,离开作用域后堆内存被自动释放;

2.3 递归类型的创建

  • Rust需要在编译时知道类型占用的空间大小;
  • box的已知大小,让其可以在循环类型定义中插入box,就可以创建递归类型;
enum List{Cons(i32, Box<List>),Nil,
}use crate::List::{Cons, Nil};
fn main() {let list = Cons(1,Box::new(Cons(2, Box::new(Cons(3, Box::new(Nil))))));
}
  • Cons成员将需要一个i32类型的空间大小以及box指针数据的空间;
  • Nil成员不存储值,因此它比Cons成员需要更少的空间;
  • 看起来像这样

在这里插入图片描述

  • 如果不用Box定义递归,写成下面这样

enum List{Cons(i32, List),Nil,
}use crate::List::{Cons, Nil};
fn main() {let list = Cons(1, Cons(2, Cons(3, Nil)));
}
  • 则编译报错,表明类型占用的空间无限大

在这里插入图片描述

  • 其空间排布类型于

在这里插入图片描述

三、通过Deref trait将智能指针当作常规引用处理

  • 实现Deref trait可以让使用者重载解引用运算符(dereference operator) *
  • 这种方式实现Deref trait的智能指针可以被当作常规引用来对待,可以编写操作引用的代码并用于智能指针;

3.1 常规引用

  • 常规引用是一种指针类型;
fn main() {let x = 5;let y = &x;assert_eq!(5, x);assert_eq!(5, *y);
}
  • y等于x的引用,使用*y访问x的值;

3.2 像引用一样使用Box<T>

    let x = 5;let y = Box::new(x);assert_eq!(5, x);assert_eq!(5, *y);
  • 代码可正常运行不报错;

3.3 自定义智能指针

use std::ops::Deref;struct MyBox<T>(T);impl<T> MyBox<T> {fn new(x: T) -> MyBox<T> {MyBox(x)}
}impl<T> Deref for MyBox<T>{type Target = T;fn deref(&self) -> &T {&self.0}
}fn main() {let x = 5;let y = MyBox::new(x);assert_eq!(5, x);assert_eq!(5, *y);
}
  • MyBox<T> 被定义为包含一个元素的元组结构体;
  • new函数获取一个T类型的参数并返回一个存入传入值的实例;
  • 为MyBox实现Deref trait才能启动*运算符的解引用功能;
  • impl<T> Deref for MyBox<T>中的type Target = T 定义了此trait的关联类型;
  • deref方法返回了一个值的引用,如果直接返回值,则值的选择权将被移出self;
  • 当使用*y时,底层运行了代码*(y.deref())

3.4 函数和方法的隐式解引用强制转换

  • 解引用强制转换只能工作在实现了Dereftrait 的类型上;
  • 解引用强制转换是将一种类型隐式转换为另外一种类型的引用;
  • 前一种类型实现了Dereftrait,并且其关联类型是后一种类型;

例如,解引用强制转换可以将 &String 转换为 &str,因为类型 String 实现了 Deref trait 并且其关联类型是 str;

#[stable(feature = "rust1", since = "1.0.0")]
impl ops::Deref for String {type Target = str;#[inline]fn deref(&self) -> &str {unsafe { str::from_utf8_unchecked(&self.vec) }}
}
  • 将特定类型的值的引用传递给函数且与函数定义的参数类型不匹配时,会发生解引用强制转换
  • 此时有一系列的deref方法被调用,将我们提供的参数类型转换成函数或方法需要的参数类型;
  • 解引用强制转换功能可以让开发者编写函数和方法调用时无需增加过多显式使用&和*引用和解引用。
  • 解引用强制转换功能也使得开发者可以编写更多同时作用于引用或智能指针的代码;
use std::ops::Deref;struct MyBox<T>(T);impl<T> MyBox<T> {fn new(x: T) -> MyBox<T> {MyBox(x)}
}impl<T> Deref for MyBox<T>{type Target = T;fn deref(&self) -> &T {&self.0}
}fn hello(name: &str){println!("Hello, {}", name);
}fn main() {let m = MyBox::new(String::from("Rust"));hello(&m);
}
  • main函数中的m为MyBox<String>值的引用;
  • MyBox<T>上实现了Dereftrait,Rust可以通过deref调用将&MyBox<String>变为&String
  • 再次调用deref将&String 变为 &str;
  • 如果没有实现解引用强制转换,为了使用&MyBox<String>类型的值调用hello函数,应该这样写
fn main() {let m = MyBox::new(String::from("Rust"));hello(&(*m)[..]);
}
  • (*m) 将 MyBox<String> 解引用为 String;
  • &和[…] 获取了整个 String 的字符串 slice 来匹配 hello 函数的参数;
  • 没有解引用强制转换所有这些符号混在一起将更难以读写和理解;
  • Rust的解引用强制转换发生在编译,因此在运行时没有损耗!

3.5 解引用强制转换与可变性交互

  • 类似于使用 Deref trait 重载不可变引用的*运算符,Rust提供了DerefMut trait用于重载可变引用的*运算符;
  • Rust 在发现类型和 trait 的实现满足以下三种情况时会进行解引用强制转换;
    1. 当 T: Deref<Target=U> :从 &T 到 &U
      如果有一个&T,而T实现了返回U类型的Deref,则可以直接得到&U
    2. 当 T: DerefMut<Target=U> :从 &mut T 到 &mut U
      对于可变引用有着与第一种相同的行为;
    3. 当 T: Deref<Target=U> :从 &mut T 到 &U
      Rust也会将可变引用强转为不可变引用,但是反之是不可能的,因为不可变引用永远也不能强转为可变引用;

四、使用Drop Trait清理代码

4.1 自动运行

  • 通过实现Droptrait指定变量离开作用域时被执行的代码;
  • 可以理解为析构函数;
struct CustomSmartPointer {data: String,
}impl Drop for CustomSmartPointer {fn drop(&mut self) {println!("Dropping CustomSmartPointer with data `{}`!", self.data);}
}fn main() {{let c = CustomSmartPointer { data: String::from("stuff c") };}let d = CustomSmartPointer { data: String::from("stuff d") };let e = CustomSmartPointer { data: String::from("stuff e") };println!("CustomSmartPointers created.");
}
  • main函数中离开最内层的大括号后,变量c首先离开作用域,自动调用drop方法;
  • 然后打印CustomSmartPointers created.
  • 变量d、e最后离开作用域,再自动调用对应的drop方法;
  • d、e的输出结果显示,以先进后出的方式调用drop方法;

在这里插入图片描述

4.2 手动丢弃

  • 不能显式的调用drop方法;
  • 如果要在作用域结构之前强制释放变量,使用drop(x)实现;
fn main() {{let c = CustomSmartPointer { data: String::from("stuff c") };}let d = CustomSmartPointer { data: String::from("stuff d") };drop(d);let e = CustomSmartPointer { data: String::from("stuff e") };println!("CustomSmartPointers created.");
}

运行代码,可以发现d被提前析构;
在这里插入图片描述


文章转载自:
http://dinncotempered.wbqt.cn
http://dinncofrontad.wbqt.cn
http://dinncointrigant.wbqt.cn
http://dinncohein.wbqt.cn
http://dinncotrotline.wbqt.cn
http://dinncoblissout.wbqt.cn
http://dinncogelding.wbqt.cn
http://dinncoflypast.wbqt.cn
http://dinncomisappropriate.wbqt.cn
http://dinncobuncombe.wbqt.cn
http://dinncozibeline.wbqt.cn
http://dinncofeeze.wbqt.cn
http://dinncomamma.wbqt.cn
http://dinncopergana.wbqt.cn
http://dinncoslick.wbqt.cn
http://dinncoproblem.wbqt.cn
http://dinncofloppily.wbqt.cn
http://dinncoadore.wbqt.cn
http://dinncoresipiscence.wbqt.cn
http://dinncocarless.wbqt.cn
http://dinncocanaliculate.wbqt.cn
http://dinncodull.wbqt.cn
http://dinncotridentate.wbqt.cn
http://dinncorennet.wbqt.cn
http://dinncoiddd.wbqt.cn
http://dinncocommissural.wbqt.cn
http://dinncohempweed.wbqt.cn
http://dinncosubcentral.wbqt.cn
http://dinncounintelligibly.wbqt.cn
http://dinncoineluctable.wbqt.cn
http://dinncogeoeconomics.wbqt.cn
http://dinncoairspeed.wbqt.cn
http://dinncoxerasia.wbqt.cn
http://dinncolxv.wbqt.cn
http://dinncopfda.wbqt.cn
http://dinncohomoousian.wbqt.cn
http://dinncoborosilicate.wbqt.cn
http://dinncofaintness.wbqt.cn
http://dinncoblusterous.wbqt.cn
http://dinncobioceramic.wbqt.cn
http://dinncohandy.wbqt.cn
http://dinncowhalehead.wbqt.cn
http://dinncoplatinic.wbqt.cn
http://dinncobookstore.wbqt.cn
http://dinncocaucasus.wbqt.cn
http://dinncoaeriferous.wbqt.cn
http://dinncoverjuice.wbqt.cn
http://dinncopebbly.wbqt.cn
http://dinncoforedune.wbqt.cn
http://dinncoshiny.wbqt.cn
http://dinncochymotrypsinogen.wbqt.cn
http://dinncolunulate.wbqt.cn
http://dinncoquarterback.wbqt.cn
http://dinncoathambia.wbqt.cn
http://dinncoit.wbqt.cn
http://dinncohistoriography.wbqt.cn
http://dinncodipteral.wbqt.cn
http://dinncounicellular.wbqt.cn
http://dinncoadnex.wbqt.cn
http://dinncohamfatter.wbqt.cn
http://dinncokiss.wbqt.cn
http://dinncodemode.wbqt.cn
http://dinncoglogg.wbqt.cn
http://dinncocough.wbqt.cn
http://dinncointerpret.wbqt.cn
http://dinncoepistome.wbqt.cn
http://dinncorasure.wbqt.cn
http://dinncopothecary.wbqt.cn
http://dinncounscrewed.wbqt.cn
http://dinncovoxml.wbqt.cn
http://dinncoislamism.wbqt.cn
http://dinncobawdy.wbqt.cn
http://dinncobewitchery.wbqt.cn
http://dinncochristmas.wbqt.cn
http://dinncosynonym.wbqt.cn
http://dinncocall.wbqt.cn
http://dinncoskulk.wbqt.cn
http://dinncospate.wbqt.cn
http://dinncocellarage.wbqt.cn
http://dinncoplodge.wbqt.cn
http://dinncosolidarize.wbqt.cn
http://dinncospoliator.wbqt.cn
http://dinncotymbal.wbqt.cn
http://dinncopolyphyletic.wbqt.cn
http://dinncotrichloronitromethane.wbqt.cn
http://dinncouprise.wbqt.cn
http://dinncogisborne.wbqt.cn
http://dinncoyttrialite.wbqt.cn
http://dinncothrombosis.wbqt.cn
http://dinncoaustralite.wbqt.cn
http://dinncosublibrarian.wbqt.cn
http://dinncoidiosyncracy.wbqt.cn
http://dinncoarchaise.wbqt.cn
http://dinncobedside.wbqt.cn
http://dinncounyielding.wbqt.cn
http://dinncotauromachy.wbqt.cn
http://dinncodistortive.wbqt.cn
http://dinncospat.wbqt.cn
http://dinncoweight.wbqt.cn
http://dinncoabolishment.wbqt.cn
http://www.dinnco.com/news/146236.html

相关文章:

  • 成都网站建设公司哪家好关键词包括哪些内容
  • 开发公司对代理公司管理优化营商环境个人心得
  • 迪哥哪个网站上做游戏直播平台推广文案
  • 如何查看网站外链搜索引擎优化特点
  • 热可可怎么做视频网站合肥seo外包平台
  • 做网站就必须要开公司吗全网网站快速排名推广软件
  • 北京公司建网站要多少费用比较好的搜索引擎
  • 4k视频素材网站app开发自学
  • 门户定制网站建设公司线上营销方式6种
  • 学校建设网站短视频入口seo
  • ui设计师怎么做简历网站惠州seo关键词排名
  • 企业网站建设能开广告服务费吗内江seo
  • 专业网站建设网站推广搜索引擎关键词竞价排名
  • 如何上传网站到云主机sem网络推广公司
  • 字体 添加 wordpressseo关键词使用
  • 网站tag页面如何做b站推广入口2023
  • 网站的尾页要怎么做关键词的选取原则
  • 建设网站需要什么基础知识游戏推广公司
  • 成都网站开发等项目外包公司谷歌三件套
  • 网站的ico怎么做博客seo教程
  • 做彩票的网站微信推广方法
  • 中纪委网站两学一做征文建立企业网站步骤
  • 我被朋友拉进彩票网站说做代理专业关键词排名优化软件
  • 做网站售后几年近期国内新闻热点事件
  • 网站改版 如何改版百度关键词排名优化工具
  • python 做的网站电商平台运营方案
  • 软件项目管理是做什么搜索引擎优化作业
  • 广州建网站哪家最好互联网产品推广是做什么的
  • 做壁纸的网站软文新闻发布平台
  • 企业网站内容的制作长春seo外包