Rust学习笔记(十九)String(上)
Rust开发者经常会被字符串困扰的原因Rust倾向于暴露可能产生的错误 字符串数据结构复杂 UTF-8 字符串在Rust里是什么
字符串是字节(Byte)集合,它提供了一些方法能将byte解析为文本。在Rust的核心语言层面,只有一个字符串类型:字符串切片str(或&str) 字符串切片:对存储在其它地方并且是UTF-8编码的字符串的引用。例如字符串字面值是存储在二进制文件中的,它也是字符串切片。
String类型: 来自标准库而不是核心语言 可增长、可修改、可拥有(可获得所有权) 也是UTF-8编码 通常说的字符串是指什么?
通常情况下是指String和&str(字符串切片) 标准库用得多 UTF-8编码
Rust标准库还包含了很多其它的字符串类型,例如: OsString OsStr CString CStr
通常以String结尾的可获得所有权,以Str结尾的是可借用的。这些可以存储不同编码的文本或在内存中以不同形式来展现。
某些第三方库(Library crate)针对存储字符串可提供更多的选项。
这里主要讲String类型的字符串。 创建一个新的字符串(String)
由于String是字节集合,所以很多Vec的操作都可用于String。例如: 使用String::new()函数创建空字符串 使用to_string()方法创建含初始值的String。此方法可用于实现了Display trait的类型,包括字符串字面值。例: fn main() { let data = "initial contents"; let s: String = data.to_string(); let s1: String = "initial contents".to_string(); } 使用String::from()函数来从字面值创建String,例: fn main() { let s: String = String::from("initial contents"); } 更新Stringpush_str()方法:把一个字符串切片附加到String,例: fn main() { let mut s: String = String::from("initial contents"); s.push_str("string"); let s1 = String::from("123"); s.push_str(&s1);//push_str()是借用参数。不会获得实参的所有权,所以下面还可以使用s1 println!("{}, {} ", s, s1) } push()方法:把单个字符附加到String,例: fn main() { let mut s: String = String::from("LO"); s.push("L"); println!("{}", s) } +:连接(拼接)字符串,例: fn main() { let s: String = String::from("LO"); let s1: String = String::from("L"); let s2 = s + &s1; println!("{}", s2) }
看一个例子: fn main() { let s1: String = String::from("LO"); let s2: String = String::from("L"); let s3 = s1 + &s2; println!("{}, {}, {}", s3, s1, s2); }
以上代码无法通过编译,s1在拼接之后无法再次使用。 因为+运算符使用了类似于fn add(self, s: &str) -> String {}方法,参数self是s1,因为不是引用,所以函数取得了s1的所有权,因此s无法再次使用。而参数s是s2, 我们传入的是s2的引用,函数不具有s2的所有权,所以s2可以再次使用。 注意这里的s: &str,它是字符串切片,但是我们传入的类型是String的引用。为什么类型不同还可以编译成功呢?因为编译器使用了"解引用强制转换(deref coercion)"的技术,它把String的引用转换成了字符串切片。 format!宏: 连接多个字符串,例: fn main() { let s1: String = String::from("12"); let s2: String = String::from("34"); let s3: String = String::from("56"); let s4 = format!("{}-{}-{}", s1, s2, s3);//format!()不取得参数所有权 // let s4 = s1 + "-" + &s2 + "-" + &s3;//与format!()效果类似,但s1无法再次使用 println!("{}, {}, {}, {}", s4, s1, s2, s3); }
韩国人估计没想到,现代居然买了宁德时代的CTP授权关注并标星电动星球News每天打卡阅读更深刻理解汽车产业变革出品电动星球News作者毓肥上周星期三,宁德时代搞了个事情。10月27日,宁德时代与现代摩比斯签署技术许可与合作意向协议
特斯拉Q3财报30。5利润率捅破天花板,下一款车2023年发布关注并标星电动星球News每天打卡阅读更深刻理解汽车产业变革出品电动星球News作者毓肥不出意料地,马斯克并没有出席特斯拉2021Q3财报会议。这是他在Q2会议上就已经预告的如果没
毛巾架选对了,卫生间舒适感倍增卫生间装修时大部分的人会忽略毛巾架的选择和安装,认为毛巾架这个物件可有可无,随意安装便可。其实不然,毛巾架除了挂放毛巾以外,还影响到整个卫生间的便利性和舒适性。一旦没选好,或者毛巾
皮革家居的魅力,看一眼就沦陷有皮革元素的家,往往怀旧中带着令人瞩目的高级感,虽然看起来特立独行,但运用好了却能展现极强的包容性,能在家居中游刃有余的与各种元素相互搭配,相互衬托。并且它的纹理和质感,有着提升空
家居建材行业,有哪些获客渠道,能让成交水到渠成随着家居,装修设计货运物流和电子商务环境的日趋健全,家居品牌的竞争力从地区市场竞争扩展为各省区域的市场竞争,一些以降低成本为核心竞争力的知名品牌发觉总是能找出比自身价钱还低的相近竞
安防周看点智能家居新连接标准MatterZigbee联盟更名一周热点亚马逊苹果等合作发起智能家居新连接标准Matter5月12日消息,苹果亚马逊和谷歌等大型科技公司组成的连接标准联盟宣布推出一个用于智能家居设备的新连接标准Matter,第一
浅析关于智能家居标准建设前言近年来,随着科技的迅速发展,AIoT的概念开始盛行,智能家居产业进入了一个全新的发展时期。智能家居的标准如何定义?怎样才能称之为智能?未来智能家居行业的发展趋势是什么?智能家居
智能家居成为刚需,要解决什么?智能家居建设是一个整体的概念,全屋智能才是真正完成了智能家居,毕竟单一产品很难形成物联网的效果。正如蓝牙联盟高级开发者关系经理孙啸所说,目前市场上多数家居品牌产品碎片化,实现全屋智
在Mac上安装ElasticsearchElasticsearch简介Elasticsearch是一个用Java开发的开源全文搜索引擎。用户上传JSON格式的数据集。然后,Elasticsearch在向集群索引中的文档添
强大的抓包工具mitmproxy对于抓包工具,我刚开始从Charles(青花瓷抓包工具)开始的,虽然说功能还是特别的强大。如何给抓到数据存入到数据库中呢,这里我推荐一下mitmproxy。安装在Mac安装mitm
十分钟了解Mongodb数据库前言本文可能比较长,主要分为3个部分。1。mongodb的简介。2。mongodb的安装。3。mongodb查询指令,大家可以根据选择进行阅读。1。2什么是MongoDBMongo