成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Rust語言:類型轉換,還可以這么玩,你學到了嗎

開發 后端
你是否遇到過設計比較奇葩的函數的形參,而你手中沒有適合的變量類型?你是否也曾絞盡腦汁的去提取各種嵌套類型里的核心變量的引用呢?

你是否遇到過設計比較奇葩的函數的形參,而你手中沒有適合的變量類型?

你是否也曾絞盡腦汁的去提取各種嵌套類型里的核心變量的引用呢?

只要你搞明白Rust的幾種常見的類型轉換,徹底告別編譯器的紅色警告,享受寫完就編譯通過的快感。

什么是類型轉換?

類型轉換,是調用函數時,根據函數要求的參數簽名類型A,將我們手中的類型B轉換為類型A的過程,而且不能改變B的所有權。一般的函數調用都要求我們傳遞引用,很少需要直接傳遞所有權的。

很多語言提供了向上轉型和向下轉型,例如Java和C++等,如此使用(B)A,即可將B強制轉換成A。但是強轉是有一定的風險的,Java里強轉失敗會拋出CastException,而在C++里有時候不拋異常,必須使用更高版本的cast系列函數去轉換,才可以保證轉換失敗時給出異常,避免產生內存安全的問題。

Rust雖然是各種安全風險可控的編程語言,但是也有一些是需要開發人員事先了解的,比如整型之間強轉的結果并不盡如人意。

as操作符

1、在編碼過程中,使用最多的轉換,要數整型的強制轉換了。

我們往往會遇見這樣的類型需求usize,這個類型一般代指長度或者數組索引,我們只有i32之類的整型變量是不能直接透傳進去的,必須使用as關鍵字作強制轉換后,才可以通過編譯器的檢測。

但是,這里會發生一些意想不到的事情,比如類型截斷。

什么是類型截斷,即一個值范圍較大的變量A轉換為值范圍較小的變量B,如果超出范圍,則將A減去B的區間長度。

例如,128超出了i8類型的范圍(-128,127),強轉之后的值等于128-256=-128。

2、在學習Trait的時候,我們發現一個問題,類型A可以實現很多Trait,有些Trait存在函數簽名相同的情況,但是內部實現卻不相同,如果使用A為主題去調用的話,編譯器無法判斷應該調用哪個函數,所以必須將A向上強轉為特定的Trait,以告知編譯器如何做出判斷。

例如,B和C是有同名含函數name()的Trait,A分別實現了他們,當A想要調用B的name()的時候,需要顯示轉換,避免歧義,如::name()。

3、as還可以在父類型與子類型之間相互轉換,比如&’static str和&'a str。'static生命周期是整個進程存活期間有效的,而'a的生命周期較短,我們稱&'static是&'a的子類型,使用'static:'a來表示。as可以將父子類型自由轉換,如&'static str as &'a str,這種做法的意義是為了滿足某些函數對生命周期的要求。

From和Into

這2個Trait定義在標準庫的convert模塊中,其實他們做的是同一件事情,不要被From和Into繞暈掉。

舉個形象的比喻,我吃飯,和飯被我吃,是一回事。只要我在吃飯,那么飯肯定正在被我吃,是一個道理。

Rust還為此定義了一個定理:如果類型A實現了From,則B類型實例調用into方法就可以轉換為類型A。

例如,我們常見的字符串String類型實現了From(&str),那么&str就可以into()為String。

大多數情況下,我們只需要實現From這個Trait即可,Rust為所有實現From的自動實現了反方向的Into。

From和Into也不是完全沒有異常發生的,當我們不確定轉換的結果是我們想要的時候,可以實現TryFrom和TryInto這兩個Trait,以捕獲可能發生的錯誤信息。

AsRef和AsMut

AsRef和AsMut可以將類型分別轉換為不可變引用和可變引用。這兩個Trait對我們實現可擴展的函數是非常有幫助的。

比如,我們想設計一個允許傳入&String和&str都可以的函數,那么像下圖中的test函數那樣做:

如果我們自己定義一個類型,最好能實現AsRef這個Trait,它會給我們帶來很多意想不到的實惠。

FromStr

Rust內置了很多幫助我們類型轉換的實現,字符串和其他類型之間的轉換,都會默認實現FromStr這個Trait。

如果想把一個字符串轉換為整型,可以使用parse函數,它會根據返回值類型自動解析字符串,以得到正確類型的返回值。

整型轉換為字符串,就不用多說了,直接format宏格式化即可。

寫在最后

雖然Rust類型繁多,但是類型的統一風格做的還是不錯的,通過各種Trait讓類型與類型之間的邏輯脈絡有了統一的可能性,不得不說,理解了類型轉換之后,在設計代碼的時候可以更加的優雅,兼容性更好。

作為十幾年的程序員來說,語言之間都是有共性的,縱觀所有的編程語言,Rust在類型設計上并不是那么優雅的,特別是泛型與生命周期結合起來以后,讓程序員對代碼的直觀理解降低到了一個可怕的程度。

既然選擇學習Rust,就要有相關的覺悟,學習曲線陡峭才可以拉開與懶惰者的差距。

學會努力,比努力本身更重要。

 

責任編輯:未麗燕 來源: 今日頭條
相關推薦

2022-12-06 17:30:04

2024-10-18 11:48:00

2024-07-31 09:28:56

2021-09-03 06:46:34

MyBatis緩存后端

2017-11-27 12:24:02

命令行代碼指令

2024-08-12 15:44:06

2021-12-26 18:30:56

嵌入式ARM鏈接

2017-03-07 09:49:18

存儲

2020-10-09 10:45:22

語言代碼數組

2016-12-02 20:43:28

Android

2021-07-29 18:46:52

可視化類型圖形化

2023-10-16 08:55:43

Redisson分布式

2022-07-18 07:58:46

Spring工具工具類

2023-04-10 07:40:36

GraphQLRest通信模式

2016-12-26 09:50:15

2017-09-27 14:57:44

IOS 11Siri蘋果

2023-06-03 00:05:18

TypeScriptJSDoc掃描器

2022-07-19 08:04:04

HTTP應用層協議

2024-11-13 09:22:40

2017-11-06 19:09:45

在線抓娃娃機
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 欧美亚洲日本 | 中文字幕一区在线观看视频 | 一区二区亚洲 | 欧美白人做受xxxx视频 | 国产一区二区在线播放 | 精品国产一区二区三区日日嗨 | 日本久久网 | 日日干夜夜草 | 最新国产精品精品视频 | 国产99久久 | 日韩免费在线视频 | 成人免费视频一区二区 | 国产成人99久久亚洲综合精品 | 精品久久久久一区二区国产 | av片免费观看 | 国产日韩欧美精品一区二区三区 | av久久 | av网站在线免费观看 | 日韩欧美一级精品久久 | 日韩视频中文字幕 | 久久久视| 欧美日韩亚洲国产 | 中文字幕乱码亚洲精品一区 | 久久久网 | 久久国产成人午夜av影院武则天 | av网站在线免费观看 | 国产高清视频一区 | 91偷拍精品一区二区三区 | 欧美视频三级 | 色噜噜亚洲男人的天堂 | 中文字幕日韩一区 | av手机在线播放 | 日韩在线小视频 | 日本精品久久久久 | 国产成人精品一区二区三区视频 | 日韩欧美国产精品一区二区 | 麻豆视频在线看 | 日韩一级精品视频在线观看 | 色噜噜亚洲男人的天堂 | 亚洲视频在线一区 | 夜夜爽99久久国产综合精品女不卡 |