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

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

CRust學(xué)習(xí)筆記:生命周期-2

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

本系列文章是Jon Gjengset發(fā)布的CRust of Rust系列視頻的學(xué)習(xí)筆記,CRust of Rust是一系列持續(xù)更新的Rust中級(jí)教程

讓我們接著上一篇文章繼續(xù)學(xué)習(xí)Rust的生命周期。在上一篇文章中的代碼基礎(chǔ)上,加入如下的函數(shù)和測(cè)試用例:

 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}
編譯器會(huì)報(bào)如下錯(cuò)誤:
error[E0515]: cannot return value referencing temporary value

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

有一種解決辦法是使用String

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

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

&str -> &[char]:相當(dāng)于胖指針,包含指向str的指針和字符串的長(zhǎng)度。

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

String轉(zhuǎn)換&str相對(duì)容易一些,因?yàn)橐阎址钠鹗嘉恢眉伴L(zhǎng)度。而&str轉(zhuǎn)換成String就復(fù)雜一些,需要先在堆上分配一段空間,然后再通過內(nèi)存拷貝(memcpy)把字符copy到堆上。

因此使用String的第一個(gè)問題是性能問題;第二個(gè)問題是不能兼容嵌入式系統(tǒng),大多數(shù)嵌入式系統(tǒng)沒有堆內(nèi)存。

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

1#[derive(Debug)]
2pubstructStrSplit<'haystack,?'delimiter>{
3//使用Option
4remainder:Option<&'haystack?str>,
5delimiter:&'delimiterstr,
6}
 1impl<'haystack,?'delimiter>StrSplit<'haystack,?'delimiter>{
 2/**
 3*新構(gòu)建的StrSplit與傳入的參數(shù)haystack,delimiter擁有相同的生命周期
 4*/
 5pubfnnew(haystack:&'haystackstr,delimiter:&'delimiterstr)->Self{
 6Self{
 7remainder:Some(haystack),
 8delimiter,
 9}
10}
11}
12
13impl<'haystack>IteratorforStrSplit<'haystack,?'_>{
14//迭代的結(jié)果也要與StrSplit擁有相同的生命周期,是因?yàn)橐赟trSplit的成員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}
執(zhí)行cargo test,測(cè)試通過。 泛型化Delimiter 在這里我們將分隔符進(jìn)行泛型化,使得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}
定義一個(gè)trait,包含一個(gè)find_next()方法,用于返回分隔符在字符串中的起始位置和結(jié)束位置
1pubtraitDelimiter{
2//返回分隔符在字符串中的起始位置和結(jié)束位置
3fnfind_next(&self,s:&str)->Option<(usize,?usize)>;
4}
迭代器修改如下:
 1impl<'haystack,?D>IteratorforStrSplit<'haystack,?D>
 2where
 3D:Delimiter
 4{
 5//迭代的結(jié)果也要與StrSplit擁有相同的生命周期,是因?yàn)橐赟trSplit的成員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分別實(shí)現(xiàn)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}
函數(shù)until_char()修改為:
1pubfnuntil_char(s:&str,c:char)->&str{
2StrSplit::new(s,c)
3.next()
4.expect("StrSplitalwaysgivesatleastoneresult")
5}
執(zhí)行cargo test,測(cè)試通過。

審核編輯:湯梓紅

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 函數(shù)
    +關(guān)注

    關(guān)注

    3

    文章

    4361

    瀏覽量

    63657
  • 生命周期
    +關(guān)注

    關(guān)注

    0

    文章

    16

    瀏覽量

    7490
  • Rust
    +關(guān)注

    關(guān)注

    1

    文章

    233

    瀏覽量

    6848

原文標(biāo)題:CRust學(xué)習(xí)筆記:生命周期-2

文章出處:【微信號(hào):Rust語言中文社區(qū),微信公眾號(hào):Rust語言中文社區(qū)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    基于Rust語言中的生命周期

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

    AutoScaling 生命周期掛鉤功能

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

    HarmonyOS應(yīng)用開發(fā)-PageAbility生命周期

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

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

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

    一文讀懂Android Activity生命周期

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

    基于延長(zhǎng)WSN生命周期的LEACH算法的改進(jìn)

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

    Synopsys 啟動(dòng)硅生命周期管理計(jì)劃

    Synopsis 的數(shù)據(jù)分析驅(qū)動(dòng)的硅生命周期管理計(jì)劃解決了 IC 生命周期中的質(zhì)量、可靠性和安全挑戰(zhàn)。
    發(fā)表于 08-18 15:37 ?984次閱讀
    Synopsys 啟動(dòng)硅<b class='flag-5'>生命周期</b>管理計(jì)劃

    CRust學(xué)習(xí)筆記生命周期-1

    本系列文章是Jon Gjengset發(fā)布的CRust of Rust系列視頻的學(xué)習(xí)筆記CRust of Rust是一系列持續(xù)更新的Rust中級(jí)教程。
    的頭像 發(fā)表于 12-19 09:33 ?990次閱讀

    CRust學(xué)習(xí)筆記:聲明宏

    本系列文章是Jon Gjengset發(fā)布的CRust of Rust系列視頻的學(xué)習(xí)筆記CRust of Rust是一系列持續(xù)更新的Rust中級(jí)教程。
    的頭像 發(fā)表于 01-06 14:37 ?969次閱讀

    CRust學(xué)習(xí)筆記:智能指針和內(nèi)部可變性

    本系列文章是Jon Gjengset發(fā)布的CRust of Rust系列視頻的學(xué)習(xí)筆記CRust of Rust是一系列持續(xù)更新的Rust中級(jí)教程。
    的頭像 發(fā)表于 01-29 14:58 ?920次閱讀

    Vue入門Vue的生命周期

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

    編譯器的標(biāo)準(zhǔn)生命周期

    編譯器的標(biāo)準(zhǔn)生命周期
    發(fā)表于 03-14 19:06 ?0次下載
    編譯器的標(biāo)準(zhǔn)<b class='flag-5'>生命周期</b>

    編譯器的標(biāo)準(zhǔn)生命周期

    編譯器的標(biāo)準(zhǔn)生命周期
    發(fā)表于 07-05 19:32 ?1次下載
    編譯器的標(biāo)準(zhǔn)<b class='flag-5'>生命周期</b>

    鴻蒙開發(fā):【PageAbility的生命周期

    PageAbility生命周期是PageAbility被調(diào)度到INACTIVE、ACTIVE、BACKGROUND等各個(gè)狀態(tài)的統(tǒng)稱。PageAbility生命周期流轉(zhuǎn)及狀態(tài)說明見如下圖1、表1所示。
    的頭像 發(fā)表于 06-17 10:05 ?846次閱讀
    鴻蒙開發(fā):【PageAbility的<b class='flag-5'>生命周期</b>】

    鴻蒙開發(fā)組件:DataAbility的生命周期

    應(yīng)用開發(fā)者可以根據(jù)業(yè)務(wù)場(chǎng)景實(shí)現(xiàn)data.js/data.ets中的生命周期相關(guān)接口。DataAbility生命周期接口說明見下表。
    的頭像 發(fā)表于 06-20 09:39 ?584次閱讀
    主站蜘蛛池模板: 中出丰满大乳中文字幕 | 国产亚洲欧美成人久久片 | 国产精品免费看久久久香蕉 | 久久久久久人精品免费费看 | 男人都懂的网址在线看片 | 天堂网www中文在线 天堂网传媒 | 国产欧美视频在线 | 日本69xxxxxxxx69| 99久久国产免费 - 99久久国产免费 | 午夜性刺激免费视频观看不卡专区 | 毛片三级在线观看 | 国产精品免费观看网站 | 老色批午夜免费视频网站 | 欧美xxxx性高清 | 日韩一区二区三区免费 | 色综合社区 | 免费理论片在线观看播放 | 成人午夜亚洲影视在线观看 | 在线视频免费视频网站 | 911精品国产91久久久久 | 四虎在线最新地址公告 | 国产一区二区三区四卡 | 一卡二卡四卡无卡乱免费网页 | 午夜性爽爽爽 | videossexotv极度另类高清 | 一区二区免费在线观看 | 午夜欧美日韩 | 91色在线播放 | 99热久久精品免费精品 | 国产性videostv另类极品 | 91精品国产色综合久久不卡蜜 | 国产大片黄在线看免费 | 中文字幕在线观看一区二区三区 | 男人的天堂网在线 | 37pao强力打造免费高速高清 | 性欧美视频在线观看 | 欧美一级在线观看视频 | 日本一卡二卡3卡四卡网站精品 | 国产综合精品久久亚洲 | 天天在线天天看成人免费视频 | 操美女视频网站 |