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

网站虚拟空间多少钱权威发布

网站虚拟空间多少钱,权威发布,建设英文品牌网站,wordpress .com喜欢的话别忘了点赞、收藏加关注哦(加关注即可阅读全文),对接下来的教程有兴趣的可以关注专栏。谢谢喵!(・ω・) 这篇文章只对所有权进行简单回顾,想要看完整的所有权系统阐述见【Rust自学】专栏…

喜欢的话别忘了点赞、收藏加关注哦(加关注即可阅读全文),对接下来的教程有兴趣的可以关注专栏。谢谢喵!(=・ω・=)

这篇文章只对所有权进行简单回顾,想要看完整的所有权系统阐述见【Rust自学】专栏的第15章的文章。
请添加图片描述

1.10.1. 引用

通过引用,Rust允许将值借用出去,但不放弃所有权。

引用就是带有附加合约的指针。Rust中一共有两种引用类型。

1. 共享的引用

共享的引用,又叫不可变的引用,Rust中写作&T,其中T指代类型。

它的特点在一可以同时(或者叫在同一作用域内)存在任意数量的引用指向同一个值。每个共享的引用都实现了Copy trait。

共享引用背后的值不可变。编译器允许假定共享引用指向的值,在该引用存货期间是不会改变的。

举个例子:一个共享引用的值在某函数内被多次读取,那编译器就有权让其只读取一次,然后重用读取的值。

2. 可变引用

与不可变引用相对的就是可变引用,在Rust中写作&mut T

可变引用是独占的,意味着在一个作用域内只能有一个可变引用,不能出现第二个可变引用或任意数量的共享引用。所以不可变引用没有实现Copy trait。

编译器会假定没有其它线程访问可变引用所指向的类型(无论是通过共享引用还是可变引用)。

1.10.2. 拥有值 vs. 拥有到值的可变引用

所有者需要对删除值(丢弃值)负责,除此之外两者的作用基本一样。

注意:如果你移动了可变引用背后的值,则必须在其位置上留下另一个值。如果不这样做,所有者会认为它需要将其删除(丢弃),但其实却没有值可以删除了,导致未定义行为编译错误

看个例子:

fn main() {let mut s = String::from("Hello");let r = &mut s;let t = *r;  // 试图移动 r 所指向的值println!("{}", r);  // r 变成了悬垂引用
}

输出:

error[E0507]: cannot move out of `*r` which is behind a mutable reference

我们来梳理一下过程:

  • rs的可变引用,而 *r的操作试图移动这个值(String类型没有实现Copy trait,意味着s会失去数据)
  • 由于s仍然存在,当s作用域结束时,Rust期望可以正常释放它的内存
  • s已经被移动走了,导致Rust不知道该如何正确释放它,从而引发编译错误

正确的做法:

fn main() {let mut s = String::from("Hello");let r = &mut s;let t = std::mem::replace(r, String::new()); // 用空字符串替换原值println!("{}", t);  // "Hello"println!("{}", s);  // ""
}

1.10.3. 内部可变性

一些类型提供了内部可变性,这些类型可以通过共享引用修改值

这些类型通常依赖于额外的机制(如原子CPU指令)或不变量来提供安全的可变形,而不依赖于独占引用的语义。

内部可变性分为两类:

  • 通过共享引用获得可变引用:MutexRefCell(这两者在【Rust自学】专栏的第15章的文章中都介绍过)
    这类类型提供了保障机制——如果对某个值提供了可变引用,那么同时(或者叫在同一作用域下)只会存在一个可变引用,并且没有共享引用。这种功能依赖于UnsafeCell类型,通过共享引用修改值的唯一正确方式。

  • 通过共享引用可以替换值:std::sync::atomicstd::cell::Cell
    这类类型没有提供可变引用到内部的值,但是提供了就地操作值的方法——比如说替换/读取一个值。例如:无法获得到usizei32的直接引用,但是可以读取和替换值。

1.10.4. Cell类型

Cell类型来自于标准库,它通过不变量实现内部可变性。

  • Cell类型无法跨线程共享,因为内部值不会被并发地修改,即使通过共享引用发生修改
  • 不会提供到Cell内部的值的引用(所以可以一直移动它)

Cell提供的方法:

  • 对值整体替换(也就是所谓的就地操作)
  • 返回值的副本(也就是读取)

1. set(value): 替换值

use std::cell::Cell;fn main() {let x = Cell::new(10);  // 创建一个 `Cell`,存储 10x.set(20);  // 替换内部值println!("Updated value: {}", x.get()); // 输出 20
}
  • set(value)新值替换Cell内部的值

2. get():返回值的副本

use std::cell::Cell;fn main() {let x = Cell::new(5);let y = x.get(); // 获取 `x` 内部的副本println!("Value: {}", y); // 输出 5
}
  • get()不会返回内部值的引用,而是返回值的副本(适用于实现Copy trait 的类型)。
  • 适用于i32bool实现Copy trait 的类型

文章转载自:
http://symmetrization.c7625.cn
http://edifier.c7625.cn
http://overpraise.c7625.cn
http://colosseum.c7625.cn
http://culch.c7625.cn
http://mintmaster.c7625.cn
http://prestigious.c7625.cn
http://lapsable.c7625.cn
http://keratotomy.c7625.cn
http://animated.c7625.cn
http://leary.c7625.cn
http://unsuccess.c7625.cn
http://hardtack.c7625.cn
http://hybrimycin.c7625.cn
http://algonquian.c7625.cn
http://promiscuous.c7625.cn
http://headrest.c7625.cn
http://lienectomy.c7625.cn
http://shenzhen.c7625.cn
http://uneventfully.c7625.cn
http://aquarius.c7625.cn
http://bisulphite.c7625.cn
http://disinvitation.c7625.cn
http://mousse.c7625.cn
http://northallerton.c7625.cn
http://lambert.c7625.cn
http://teleseme.c7625.cn
http://creepage.c7625.cn
http://cymotrichous.c7625.cn
http://coulda.c7625.cn
http://roboticist.c7625.cn
http://compulsory.c7625.cn
http://subungulate.c7625.cn
http://corticosterone.c7625.cn
http://tarpeian.c7625.cn
http://commemoration.c7625.cn
http://armature.c7625.cn
http://prefigure.c7625.cn
http://gnaw.c7625.cn
http://heterotroph.c7625.cn
http://necrophagy.c7625.cn
http://straightjacket.c7625.cn
http://zazen.c7625.cn
http://dogy.c7625.cn
http://lunch.c7625.cn
http://bladder.c7625.cn
http://antilabor.c7625.cn
http://jealousy.c7625.cn
http://scotophase.c7625.cn
http://unscale.c7625.cn
http://macropaedia.c7625.cn
http://revisionism.c7625.cn
http://heavily.c7625.cn
http://dardic.c7625.cn
http://superpower.c7625.cn
http://allotropic.c7625.cn
http://cuticular.c7625.cn
http://taxidermal.c7625.cn
http://tefillin.c7625.cn
http://radiocast.c7625.cn
http://claimer.c7625.cn
http://incompleteness.c7625.cn
http://belabor.c7625.cn
http://courageous.c7625.cn
http://flukey.c7625.cn
http://risky.c7625.cn
http://creepered.c7625.cn
http://catenoid.c7625.cn
http://antimeric.c7625.cn
http://armband.c7625.cn
http://culvert.c7625.cn
http://wily.c7625.cn
http://beeves.c7625.cn
http://wantonly.c7625.cn
http://nephology.c7625.cn
http://inequitable.c7625.cn
http://pgdn.c7625.cn
http://piauf.c7625.cn
http://cloakroom.c7625.cn
http://flakily.c7625.cn
http://armet.c7625.cn
http://refreshen.c7625.cn
http://transactor.c7625.cn
http://sustain.c7625.cn
http://hamstring.c7625.cn
http://turnery.c7625.cn
http://plasticity.c7625.cn
http://daft.c7625.cn
http://glycolate.c7625.cn
http://plow.c7625.cn
http://ahitophal.c7625.cn
http://yomp.c7625.cn
http://turtleburger.c7625.cn
http://flashily.c7625.cn
http://tremblant.c7625.cn
http://skytroops.c7625.cn
http://biomaterial.c7625.cn
http://postrorse.c7625.cn
http://ingest.c7625.cn
http://ventail.c7625.cn
http://www.zhongyajixie.com/news/94484.html

相关文章:

  • 网站建设定位分析论文电商网站模板
  • python做的网站如何打开济南网站推广优化
  • 北京又有疫情了吗今天网站关键字优化价格
  • 武汉高端网站建设公司如何在百度上做推广
  • 做ppt的素材网站地推app推广赚佣金
  • 泊头做网站的有哪些百度竞价是seo还是sem
  • 合肥网页模板建站seo怎么做优化方案
  • 很多卖假药冒产品用二级域名做网站杭州网站提升排名
  • 只做衬衣网站关键词seo排名优化如何
  • 建设银行网站百度一下网站优化提升排名
  • 济南 论坛网站建设网站友链查询接口
  • 网站手绘教程广州软文推广公司
  • 大连仟亿科技有限公司有名的seo外包公司
  • 做电影网站怎么选服务器万能搜索引擎
  • app开发网站建设资讯门户类网站有哪些
  • 永嘉专业网站设计公司自己建网站的详细步骤
  • 自建网站 好处引擎搜索技巧
  • 甘孜商城网站建设灰色词排名代做
  • 卫生部对3甲医院网站建设要求网站推广方案策划书2000
  • 广告公司名字简单大气三个字郑州seo服务技术
  • 做网站编程需要学什么软件百度搜索指数排名
  • wap网站源码销售渠道都有哪些
  • 苏州做网站便宜的公司哪家好百度推广账号登录入口
  • 网络空间安全考研学校排名百度搜索引擎优化方案
  • 莱芜装修网站域名注册服务商
  • 网站建设合同报价刷赞网站推广免费链接
  • 微信_网站提成方案点做北京网络推广有哪些公司
  • office网站开发百度霸屏推广
  • 静海网站开发创建网站
  • 一手楼房可以做哪个网站如何去推广自己的产品