在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

CRust學習筆記:生命周期-2

jf_wN0SrCdH ? 來源:coding到燈火闌珊 ? 作者:李明 ? 2022-12-19 09:34 ? 次閱讀

本系列文章是Jon Gjengset發布的CRust of Rust系列視頻的學習筆記,CRust of Rust是一系列持續更新的Rust中級教程

讓我們接著上一篇文章繼續學習Rust的生命周期。在上一篇文章中的代碼基礎上,加入如下的函數和測試用例:

 1fnuntil_char(s:&str,c:char)->&str{
 2StrSplit::new(s,&format!("{}",c))
 3.next()
 4.expect("StrSplitalwaysgivesatleastoneresult")
 5}
 6
 7#[test]
 8fnuntil_char_test(){
 9assert_eq!(until_char("helloworld",'o'),"hell");
10}
編譯器會報如下錯誤:
error[E0515]: cannot return value referencing temporary value

這里的臨時值是&format!("{}",c),從代碼中可以看出,參數s、c和next()之后的值要擁有相同的生命周期,因此返回值與臨時值的生命周期相同。但是這個臨時值的生命周期在函數執行完后就結束了,所以編譯不通過。

有一種解決辦法是使用String

1#[derive(Debug)]
2pubstructStrSplit<'a>{
3//使用Option
4remainder:Option<&'a?str>,
5delimiter:String,
6}
但是使用String是有兩個問題的,我們先來比較一下str,&str,String之間的區別:

str -> [char]:相當于char類型的切片,既可以分配在棧上,也可以分配在堆上,還可以分配在static區。

&str -> &[char]:相當于胖指針,包含指向str的指針和字符串的長度。

String -> Vec分配在堆上的字符向量,在棧上有一個胖指針指向這個堆上的字符向量。

String轉換&str相對容易一些,因為已知字符串的起始位置及長度。而&str轉換成String就復雜一些,需要先在堆上分配一段空間,然后再通過內存拷貝(memcpy)把字符copy到堆上。

因此使用String的第一個問題是性能問題;第二個問題是不能兼容嵌入式系統,大多數嵌入式系統沒有堆內存。

我們選擇更好的解決方案,定義多個生命周期

1#[derive(Debug)]
2pubstructStrSplit<'haystack,?'delimiter>{
3//使用Option
4remainder:Option<&'haystack?str>,
5delimiter:&'delimiterstr,
6}
 1impl<'haystack,?'delimiter>StrSplit<'haystack,?'delimiter>{
 2/**
 3*新構建的StrSplit與傳入的參數haystack,delimiter擁有相同的生命周期
 4*/
 5pubfnnew(haystack:&'haystackstr,delimiter:&'delimiterstr)->Self{
 6Self{
 7remainder:Some(haystack),
 8delimiter,
 9}
10}
11}
12
13impl<'haystack>IteratorforStrSplit<'haystack,?'_>{
14//迭代的結果也要與StrSplit擁有相同的生命周期,是因為要在StrSplit的成員remainder上做迭代。
15typeItem=&'haystackstr;
16
17fnnext(&mutself)->Option{
18letremainder=self.remainder.as_mut()?;
19ifletSome(next_delim)=remainder.find(self.delimiter){
20letuntil_remainder=&remainder[..next_delim];
21*remainder=&remainder[next_delim+self.delimiter.len()..];
22Some(until_remainder)
23}else{
24self.remainder.take()
25}
26}
27}
執行cargo test,測試通過。 泛型化Delimiter 在這里我們將分隔符進行泛型化,使得StrSplit更加通用。
 1pubstructStrSplit<'haystack,?D>{
 2//使用Option
 3remainder:Option<&'haystack?str>,
 4delimiter:D,
 5}
 6
 7impl<'haystack,?D>StrSplit<'haystack,?D>{
 8pubfnnew(haystack:&'haystackstr,delimiter:D)->Self{
 9Self{
10remainder:Some(haystack),
11delimiter,
12}
13}
14}
定義一個trait,包含一個find_next()方法,用于返回分隔符在字符串中的起始位置和結束位置
1pubtraitDelimiter{
2//返回分隔符在字符串中的起始位置和結束位置
3fnfind_next(&self,s:&str)->Option<(usize,?usize)>;
4}
迭代器修改如下:
 1impl<'haystack,?D>IteratorforStrSplit<'haystack,?D>
 2where
 3D:Delimiter
 4{
 5//迭代的結果也要與StrSplit擁有相同的生命周期,是因為要在StrSplit的成員remainder上做迭代。
 6typeItem=&'haystackstr;
 7
 8fnnext(&mutself)->Option{
 9letremainder=self.remainder.as_mut()?;
10ifletSome((delim_start,delim_end))=self.delimiter.find_next(remainder){
11letuntil_remainder=&remainder[..delim_start];
12*remainder=&remainder[delim_end..];
13Some(until_remainder)
14}else{
15self.remainder.take()
16}
17}
18}
然后為&str和char分別實現Delimiter trait:
 1implDelimiterfor&str{
 2fnfind_next(&self,s:&str)->Option<(usize,?usize)>{
 3s.find(self).map(|start|(start,start+self.len()))
 4}
 5}
 6
 7implDelimiterforchar{
 8fnfind_next(&self,s:&str)->Option<(usize,?usize)>{
 9s.char_indices()
10.find(|(_,c)|c==self)
11.map(|(start,_)|(start,start+self.len_utf8()))
12}
13}
函數until_char()修改為:
1pubfnuntil_char(s:&str,c:char)->&str{
2StrSplit::new(s,c)
3.next()
4.expect("StrSplitalwaysgivesatleastoneresult")
5}
執行cargo test,測試通過。

審核編輯:湯梓紅

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 函數
    +關注

    關注

    3

    文章

    4346

    瀏覽量

    63012
  • 生命周期
    +關注

    關注

    0

    文章

    15

    瀏覽量

    7476
  • Rust
    +關注

    關注

    1

    文章

    230

    瀏覽量

    6674

原文標題:CRust學習筆記:生命周期-2

文章出處:【微信號:Rust語言中文社區,微信公眾號:Rust語言中文社區】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    基于Rust語言中的生命周期

    Rust是一門系統級編程語言具備高效、安和并發等特,而生命周期是這門語言中比較重要的概念之一。在這篇教程中,我們會了解什么是命周期、為什么需要生命周期、如何使用生命周期,同時我們依然會
    的頭像 發表于 09-19 17:03 ?952次閱讀

    AutoScaling 生命周期掛鉤功能

    摘要: AutoScaling 伸縮組實例管理功能全面升級,新上線生命周期掛鉤(LifecycleHook)功能,方便用戶更加靈活地管理伸縮組內實例。使用生命周期掛鉤可以在伸縮組發生伸縮活動時將伸縮
    發表于 06-27 17:13

    HarmonyOS應用開發-PageAbility生命周期

    pageAbility的生命周期如下圖所示:在代碼中通過調用下列方法實現生命周期操作:onShow() :Ability由后臺不可見狀態切換到前臺可見狀態調用onShow方法,此時用戶在屏幕可以看到
    發表于 10-17 11:11

    在S32G2 RM中有“生命周期”,生命周期的完整含義是什么?

    在S32G2 RM中,有“生命周期”。生命周期的完整含義是什么,我們應該如何使用它?
    發表于 04-23 10:37

    一文讀懂Android Activity生命周期

    正常情況下Activity的生命周期: Activity的生命周期大概可以歸為三部分 整個的生命周期:onCreate()可以設置所有的“全局”狀態, onDestory()可以釋放所有的資源 可見
    發表于 05-30 01:03 ?1617次閱讀

    基于延長WSN生命周期的LEACH算法的改進

    基于延長WSN生命周期的LEACH算法的改進(開關電源技術與設計pdf百度云)-基于延長WSN生命周期的LEACH算法的改進? ? ? ? ? ? ? ? ? ??
    發表于 09-15 11:17 ?14次下載
    基于延長WSN<b class='flag-5'>生命周期</b>的LEACH算法的改進

    CRust學習筆記生命周期-1

    本系列文章是Jon Gjengset發布的CRust of Rust系列視頻的學習筆記CRust of Rust是一系列持續更新的Rust中級教程。
    的頭像 發表于 12-19 09:33 ?921次閱讀

    CRust學習筆記:聲明宏

    本系列文章是Jon Gjengset發布的CRust of Rust系列視頻的學習筆記CRust of Rust是一系列持續更新的Rust中級教程。
    的頭像 發表于 01-06 14:37 ?864次閱讀

    CRust學習筆記:智能指針和內部可變性

    本系列文章是Jon Gjengset發布的CRust of Rust系列視頻的學習筆記CRust of Rust是一系列持續更新的Rust中級教程。
    的頭像 發表于 01-29 14:58 ?863次閱讀

    Vue入門Vue的生命周期

    .生命周期 4.1生命周期是什么 Vue的生命周期, 就是Vue實例從創建到銷毀的過程.
    的頭像 發表于 02-06 16:16 ?899次閱讀
    Vue入門Vue的<b class='flag-5'>生命周期</b>

    編譯器的標準生命周期

    編譯器的標準生命周期
    發表于 03-14 19:06 ?0次下載
    編譯器的標準<b class='flag-5'>生命周期</b>

    編譯器的標準生命周期

    編譯器的標準生命周期
    發表于 07-05 19:32 ?1次下載
    編譯器的標準<b class='flag-5'>生命周期</b>

    數據包的生命周期

    電子發燒友網站提供《數據包的生命周期.pdf》資料免費下載
    發表于 10-13 14:44 ?0次下載

    鴻蒙開發:【PageAbility的生命周期

    PageAbility生命周期是PageAbility被調度到INACTIVE、ACTIVE、BACKGROUND等各個狀態的統稱。PageAbility生命周期流轉及狀態說明見如下圖1、表1所示。
    的頭像 發表于 06-17 10:05 ?754次閱讀
    鴻蒙開發:【PageAbility的<b class='flag-5'>生命周期</b>】

    鴻蒙開發組件:DataAbility的生命周期

    應用開發者可以根據業務場景實現data.js/data.ets中的生命周期相關接口。DataAbility生命周期接口說明見下表。
    的頭像 發表于 06-20 09:39 ?499次閱讀
    主站蜘蛛池模板: 35pao强力打造| 狠狠操欧美 | 日韩在线三级视频 | 国产网站在线 | 99精品久久99久久久久久 | 秋霞一级特黄真人毛片 | 欧美日韩亚洲国产一区二区综合 | 亚洲第一区在线 | 亚洲 [12p]| 久草视频在线免费看 | 玖玖爱这里只有精品 | 种子在线搜索bt | 一级欧美一级日韩 | 亚洲人成人网毛片在线播放 | 丁香六月在线 | 成人看的一级毛片 | 你懂的欧美 | 国产精品国产三级国产普通话对白 | 69国产成人综合久久精品 | 亚洲人成网i8禁止 | 呦交小u女国产秘密入口 | 国产盗摄女厕美女嘘嘘 | 天天干2018| 黄色三级在线看 | 久久综合九色综合网站 | 亚洲五月婷 | 人人成人免费公开视频 | 欧美大片一区 | 天堂在线视频网站 | 69色视频| 日本免费观看完整视频 | 久久思re热9一区二区三区 | 亚洲人成电影综合网站色 | 国产色婷婷精品综合在线手机播放 | 九草伊人 | 中文字幕123区 | 亚洲网站免费观看 | 婷婷九月| 狠狠色丁香久久婷婷综 | 亚洲国产精品久久网午夜 | 一区二区三区免费视频播放器 |