最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

聊聊Rust 運(yùn)算符

 更新時(shí)間:2021年11月11日 10:53:17   作者:棄更內(nèi)容請(qǐng)謹(jǐn)慎查看  
運(yùn)算符 用于對(duì)數(shù)據(jù)執(zhí)行一些操作。被運(yùn)算符執(zhí)行操作的數(shù)據(jù)我們稱(chēng)之為操作數(shù)。下面通過(guò)本文給大家介紹Rust 運(yùn)算符的相關(guān)知識(shí),感興趣的朋友一起看看吧

一元運(yùn)算符

顧名思義,一元操作符是專(zhuān)門(mén)對(duì)一個(gè) Rust 元素進(jìn)行操作的運(yùn)算符,主要包括以下幾個(gè):

  • - :取負(fù),專(zhuān)門(mén)用于數(shù)值類(lèi)型。實(shí)現(xiàn)了 std::ops::Neg。
  • * :解引用。實(shí)現(xiàn)了 std::ops::Deref 或 std::ops::DerefMut。
  • ! :取反。例如 !false 相當(dāng)于 true。有意思的是,如果這個(gè)操作符對(duì)數(shù)字類(lèi)型使用,會(huì)將其每一位都置反!也就是說(shuō),對(duì)一個(gè) 1u8 進(jìn)行 ! 操作,將得到一個(gè) 254u8。實(shí)現(xiàn)了 std::ops::Not。
  • &&mut :租借,borrow。向一個(gè) owner 租借其使用權(quán),分別租借一個(gè)只讀使用權(quán)和讀寫(xiě)使用權(quán)。

二元運(yùn)算符

算數(shù)操作符

  • + :加法。實(shí)現(xiàn)了 std::ops::Add。
  • -:減法。實(shí)現(xiàn)了 std::ops::Sub。
  • * :乘法。實(shí)現(xiàn)了 std::ops::Mul。
  • / :除法。實(shí)現(xiàn)了 std::ops::Div。
  • % :取余。實(shí)現(xiàn)了 std::ops::Rem。

位運(yùn)算符

  • & :與操作。實(shí)現(xiàn)了 std::ops::BitAnd。
  • | :或操作。實(shí)現(xiàn)了 std::ops::BitOr。
  • -^ :異或。實(shí)現(xiàn)了 std::ops::BitXor。
  • << :左移運(yùn)算符。實(shí)現(xiàn)了 std::ops::Shl。
  • >> :右移運(yùn)算符。實(shí)現(xiàn)了 std::ops::Shr。

惰性 boolean 運(yùn)算符

邏輯運(yùn)算符有三個(gè),分別是 &&||!。其中前兩個(gè)叫做惰性 boolean 運(yùn)算符,之所以叫這個(gè)名字,是因?yàn)樵?Rust 中也會(huì)出現(xiàn)其他類(lèi) C 語(yǔ)言的邏輯短路問(wèn)題,所以取了這么一個(gè)名字。其作用和 C 語(yǔ)言里的一模一樣。不過(guò)不同的是,Rust 里這個(gè)運(yùn)算符只能用在 bool 類(lèi)型上。

比較運(yùn)算符

比較運(yùn)算符實(shí)際上也是某些 trait 的語(yǔ)法糖,不過(guò)比較運(yùn)算符所實(shí)現(xiàn)的 trait 只有2個(gè):std::cmp::PartialEqstd::cmp::PartialOrd。

其中,==!= 實(shí)現(xiàn)的是 PartialEq,<、>>=<=實(shí)現(xiàn)的是 PartialOrd。

標(biāo)準(zhǔn)庫(kù)中,std::cmp 這個(gè) mod 下有4個(gè) trait,而且直觀來(lái)看 Ord 和 Eq 豈不是更好?但 Rust 對(duì)于這4個(gè) trait 的處理是很明確的。因?yàn)樵诟↑c(diǎn)數(shù)有一個(gè)特殊的值叫 NaN,這個(gè)值表示未定義的一個(gè)浮點(diǎn)數(shù)。在 Rust 中可以用0.0f32 / 0.0f32來(lái)求得其值,這個(gè)數(shù)是一個(gè)都確定的值,但它表示的是一個(gè)不確定的數(shù),那么NaN != NaN 的結(jié)果是啥?標(biāo)準(zhǔn)庫(kù)告訴我們是 true。但這么寫(xiě)有不符合Eq定義里的total equal(每位一樣兩個(gè)數(shù)就一樣)的定義。因此有了 PartialEq這么一個(gè)定義,NaN 這個(gè)情況就給它特指了。

為了普適的情況,Rust 的編譯器就選擇了PartialOrdPartialEq來(lái)作為其默認(rèn)的比較符號(hào)的trait。

類(lèi)型轉(zhuǎn)換運(yùn)算符

這個(gè)看起來(lái)并不算個(gè)運(yùn)算符,因?yàn)樗莻€(gè)單詞 as。就是類(lèi)似于其他語(yǔ)言中的顯示轉(zhuǎn)換了。

fn avg(vals: &[f64]) -> f64 {
    let sum: f64 = sum(vals);
    let num: f64 = len(vals) as f64;
    sum / num
}

重載運(yùn)算符

上面說(shuō)了很多 trait,就是為了運(yùn)算符重載。Rust 是支持運(yùn)算符重載的。更詳細(xì)的部分,會(huì)在后續(xù)章節(jié)中介紹。這是一個(gè)例子:

use std::ops::{Add, Sub};

\#[derive(Copy, Clone)]
struct A(i32);

impl Add for A {
    type Output = A;
    fn add(self, rhs: A) -> A {
        A(self.0 - rhs.0)
    }
}

impl Sub for A {
    type Output = A;
    fn sub(self, rhs: A) -> A{
        A(self.0 + rhs.0)
    }
}

fn main() {
    let a1 = A(10i32);
    let a2 = A(5i32);
    let a3 = a1 + a2;
    println!("{}", (a3).0);
    let a4 = a1 - a2;
    println!("{}", (a4).0);
}
    Finished debug [unoptimized + debuginfo] target(s) in 0.0 secs
     Running `yourpath\hello_world\target\debug\hello_world.exe`
5
15

格式化字符串

Rust 采取了一種類(lèi)似 Python 里面 format 的用法,其核心組成是5個(gè)宏和兩個(gè) trait :
format!、format_arg!print!println!、write!Debug、Display

之前在 hello_world 里已經(jīng)使用了 print!或者 println!這兩個(gè)宏,但是最核心的是 format!,前兩個(gè)宏只不過(guò)是將format!的結(jié)果輸出到 console 而已。

先來(lái)分析一個(gè)format!的應(yīng)用:

fn main() {
    let s = format!("今天是{0}年{1}月{2}日, {week:?}, 氣溫{3:>0width$} ~ {4:>0width$} 攝氏度。",
        2016, 11, 24, 3, -6, week = "Thursday", width = 2);

    print!("{}", s);
}

可以看到,format!宏調(diào)用的時(shí)候參數(shù)可以是任意類(lèi)型,而且可以 position 參數(shù)和 key-value 參數(shù)混合使用。但要注意一點(diǎn),key-value 的值只能出現(xiàn)在 position 值之后并且不占用 position。比如把上面的代碼改動(dòng)一下:

fn main() {
    let s = format!("今天是{0}年{1}月{2}日, {week:?}, 氣溫{3:>0width$} ~ {4:>0width$} 攝氏度。",
        2016, 11, 24, week = "Thursday", 3, -6, width = 2);

    print!("{}", s);
}

這樣將會(huì)報(bào)錯(cuò):

  Compiling hello_world v0.1.0 (yourpath/hello_world)
error: expected ident, positional arguments cannot follow named arguments
 --> main.rs:3:42
  |
3 |         2016, 11, 24, week = "Thursday", 3, -6, width = 3);
  |                                          ^

error: aborting due to previous error

error: Could not compile `hello_world`.

還需要注意的是,參數(shù)類(lèi)型必須要實(shí)現(xiàn)std::fmtmod 下的某些 trait。比如原生類(lèi)型大部分都實(shí)現(xiàn)了 DisplayDebug這兩個(gè)宏,整數(shù)類(lèi)型還額外實(shí)現(xiàn)了Binary,等等。

可以通過(guò) {:type} 的方式取調(diào)用這些參數(shù)。比如:

format!(":b", 2); // 調(diào)用 `Binary` trait

format!(":?", "hello"); // 調(diào)用 `Debug`

如果 type 為空的話默認(rèn)調(diào)用 Display。

冒號(hào) : 后面還有更多參數(shù),比如上面代碼中的{3:>0wth$}{4:>0wth$}。首先 > 是一個(gè)語(yǔ)義,它表示的是生成的字符串向右對(duì)齊,于是上面的代碼得到了003-06這兩個(gè)值。與之相對(duì)的還有向左對(duì)齊 <和居中 ^。

接下來(lái)0是一種特殊的填充語(yǔ)法,他表示用 0 補(bǔ)齊數(shù)字的空位,而 wth& 表示格式化后的字符串長(zhǎng)度。它可以是一個(gè)精確的長(zhǎng)度數(shù)值,也可以是一個(gè)以$為結(jié)尾的字符串,$前面的部分可以寫(xiě)一個(gè) key 或者一個(gè) position。

還要注意的是,在 wth 和 type 之間會(huì)有一個(gè)叫精度的區(qū)域,他們的表示通常是以 . 開(kāi)始的,比如.4 表示小數(shù)點(diǎn)后4位精度。最讓人糟心的是,任然可以在這個(gè)位置引用參數(shù),只需要個(gè)上面 wth 一樣,用.N$來(lái)表示一個(gè) position 的參數(shù),只是就是不能引用 key-value 類(lèi)型的。比如:

fn main() {
    // Hello {arg 0 ("x")} is {arg 1 (0.01) with precision specified inline (5)}
    println!("Hello {0} is {1:.5}", "x", 0.01);

    // Hello {arg 1 ("x")} is {arg 2 (0.01) with precision specified in arg 0 (5)}
    println!("Hello {1} is {2:.0$}", 5, "x", 0.01);

    // Hello {arg 0 ("x")} is {arg 2 (0.01) with precision specified in arg 1 (5)}
    println!("Hello {0} is {2:.1$}", "x", 5, 0.01);
}

將輸出:

Hello x is 0.01000
Hello x is 0.01000
Hello x is 0.01000

這一位還有一個(gè)特殊的用法,那就是 .*,它不表示一個(gè)值,而是表示兩個(gè)值。第一個(gè)值表示精確的位數(shù),第二個(gè)值標(biāo)表示這個(gè)值本身。例如:

fn main() {
    // Hello {next arg ("x")} is {second of next two args (0.01) with precision
    //                          specified in first of next two args (5)}
    println!("Hello {} is {:.*}",    "x", 5, 0.01);

    // Hello {next arg ("x")} is {arg 2 (0.01) with precision
    //                          specified in its predecessor (5)}
    println!("Hello {} is {2:.*}",   "x", 5, 0.01);

    // Hello {next arg ("x")} is {arg "number" (0.01) with precision specified
    //                          in arg "prec" (5)}
    println!("Hello {} is {number:.prec$}", "x", prec = 5, number = 0.01);
}

這個(gè)例子將輸出:

Hello x is 0.01000
Hello x is 0.01000
Hello x is 0.01000

可以在標(biāo)準(zhǔn)庫(kù)文檔查看更多format! 的說(shuō)明。

到此這篇關(guān)于Rust 運(yùn)算符的文章就介紹到這了,更多相關(guān)Rust 運(yùn)算符內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • rust?中生成與使用protobuf的方法

    rust?中生成與使用protobuf的方法

    這篇文章主要介紹了rust中protobuf生成與使用,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-05-05
  • 一文學(xué)會(huì)Rust語(yǔ)言如何操作JSON

    一文學(xué)會(huì)Rust語(yǔ)言如何操作JSON

    JSON在Web開(kāi)發(fā)中被廣泛應(yīng)用于數(shù)據(jù)交換,本文主要介紹了Rust語(yǔ)言操作JSON,包括序列化、反序列化、JSON創(chuàng)建等多個(gè)方面,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-03-03
  • Rust中泛型的學(xué)習(xí)筆記

    Rust中泛型的學(xué)習(xí)筆記

    在Rust語(yǔ)言中,泛型是一種強(qiáng)大的工具,它允許我們編寫(xiě)可復(fù)用且靈活的代碼,本文主要介紹了Rust中泛型的學(xué)習(xí)筆記,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-03-03
  • Rust自定義安裝路徑的詳細(xì)圖文教程

    Rust自定義安裝路徑的詳細(xì)圖文教程

    工欲善其事必先利其器,無(wú)論是對(duì)小白還是大神來(lái)說(shuō),想要學(xué)習(xí) Rust 第一步那必須是 Rust 的環(huán)境配置,下面這篇文章主要給大家介紹了關(guān)于Rust自定義安裝路徑的詳細(xì)圖文教程,需要的朋友可以參考下
    2023-03-03
  • Rust中的Struct使用示例詳解

    Rust中的Struct使用示例詳解

    這篇文章主要介紹了Rust中的Struct使用示例,代碼分為結(jié)構(gòu)體和實(shí)例化與訪問(wèn),本文通過(guò)示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-08-08
  • Rust之Substrate框架中Core詳解

    Rust之Substrate框架中Core詳解

    Substrate是一個(gè)用于構(gòu)建區(qū)塊鏈的開(kāi)發(fā)框架,它由Parity團(tuán)隊(duì)基于Rust語(yǔ)言開(kāi)發(fā)而成,是一個(gè)開(kāi)箱即用的區(qū)塊鏈構(gòu)造器,本文詳細(xì)介紹了Substrate框架中的Core,需要的朋友可以參考下
    2023-05-05
  • Rust之模式與模式匹配的實(shí)現(xiàn)

    Rust之模式與模式匹配的實(shí)現(xiàn)

    Rust中的模式匹配功能強(qiáng)大且靈活,它極大地提高了代碼的表達(dá)力和可讀性,本文主要介紹了Rust之模式與模式匹配,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-03-03
  • Rust文本處理快速入門(mén)

    Rust文本處理快速入門(mén)

    編程過(guò)程中有許多類(lèi)型的數(shù)據(jù)要處理,其中文本處理必不可少,本文主要介紹了Rust文本處理快速入門(mén) ,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2024-03-03
  • Rust 中解析 JSON的方法

    Rust 中解析 JSON的方法

    要開(kāi)始在 Rust 中使用 JSON,您需要安裝一個(gè)可以輕松操作 JSON 的庫(kù),目前可用的流行crate之一是 serde-json,在本文中,我們將討論如何在 Rust 中使用 JSON 解析庫(kù),以及比較最流行的庫(kù)及其性能
    2024-03-03
  • Rust 智能指針實(shí)現(xiàn)方法

    Rust 智能指針實(shí)現(xiàn)方法

    這篇文章主要介紹了Rust 智能指針的實(shí)現(xiàn)方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2024-01-01

最新評(píng)論

安远县| 京山县| 布拖县| 田东县| 库伦旗| 大足县| 连江县| 东乌珠穆沁旗| 淳化县| 隆安县| 苏尼特右旗| 新昌县| 绿春县| 昌黎县| 莱阳市| 凤冈县| 五峰| 嵊泗县| 钟山县| 宜川县| 章丘市| 青川县| 贵州省| 日土县| 建昌县| 铁岭县| 沈阳市| 康平县| 宜兴市| 新绛县| 福安市| 鄢陵县| 惠安县| 宜兴市| 调兵山市| 文成县| 昌邑市| 瑞安市| 普陀区| 马边| 商南县|