欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

聊聊Rust 運算符

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

一元運算符

顧名思義,一元操作符是專門對一個 Rust 元素進行操作的運算符,主要包括以下幾個:

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

二元運算符

算數(shù)操作符

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

位運算符

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

惰性 boolean 運算符

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

比較運算符

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

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

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

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

類型轉(zhuǎn)換運算符

這個看起來并不算個運算符,因為它是個單詞 as。就是類似于其他語言中的顯示轉(zhuǎn)換了。

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

重載運算符

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

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 采取了一種類似 Python 里面 format 的用法,其核心組成是5個宏和兩個 trait :
format!、format_arg!print!、println!write!DebugDisplay。

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

先來分析一個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ù)可以是任意類型,而且可以 position 參數(shù)和 key-value 參數(shù)混合使用。但要注意一點,key-value 的值只能出現(xiàn)在 position 值之后并且不占用 position。比如把上面的代碼改動一下:

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

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

這樣將會報錯:

  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ù)類型必須要實現(xiàn)std::fmtmod 下的某些 trait。比如原生類型大部分都實現(xiàn)了 DisplayDebug這兩個宏,整數(shù)類型還額外實現(xiàn)了Binary,等等。

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

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

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

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

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

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

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

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

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

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);
}

這個例子將輸出:

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

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

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

您可能感興趣的文章:

相關(guān)文章

  • 從零開始使用Rust編寫nginx(TLS證書快過期了)

    從零開始使用Rust編寫nginx(TLS證書快過期了)

    wmproxy已用Rust實現(xiàn)http/https代理,?socks5代理,?反向代理,?負(fù)載均衡,?靜態(tài)文件服務(wù)器,websocket代理,四層TCP/UDP轉(zhuǎn)發(fā),內(nèi)網(wǎng)穿透等,本文給大家介紹從零開始使用Rust編寫nginx(TLS證書快過期了),感興趣的朋友一起看看吧
    2024-03-03
  • Rust 函數(shù)詳解

    Rust 函數(shù)詳解

    函數(shù)在 Rust 語言中是普遍存在的。Rust 支持多種編程范式,但更偏向于函數(shù)式,函數(shù)在 Rust 中是“一等公民”,函數(shù)可以作為數(shù)據(jù)在程序中進行傳遞,對Rust 函數(shù)相關(guān)知識感興趣的朋友一起看看吧
    2021-11-11
  • 在Rust中編寫自定義Error的詳細代碼

    在Rust中編寫自定義Error的詳細代碼

    Result<T, E> 類型可以方便地用于錯誤傳導(dǎo),Result<T, E>是模板類型,實例化后可以是各種類型,但 Rust 要求傳導(dǎo)的 Result 中的 E 是相同類型的,所以我們需要編寫自己的 Error 類型,本文給大家介紹了在Rust中編寫自定義Error的詳細代碼,需要的朋友可以參考下
    2024-01-01
  • Rust?搭建一個小程序運行環(huán)境的方法詳解

    Rust?搭建一個小程序運行環(huán)境的方法詳解

    rust是一門比較新的編程語言,2015年5月15日,Rust編程語言核心團隊正式宣布發(fā)布Rust?1.0版本,本文給大家介紹Rust?搭建一個小程序運行環(huán)境,以iOS?為例介紹開發(fā)環(huán)境的準(zhǔn)備,感興趣的朋友跟隨小編一起看看吧
    2022-05-05
  • MacBook Pro安裝rust編程環(huán)境的過程

    MacBook Pro安裝rust編程環(huán)境的過程

    rustup是一個用于管理Rust版本和工具鏈的工具,這篇文章主要介紹了MacBook Pro安裝rust編程環(huán)境的過程,感興趣的朋友跟隨小編一起看看吧
    2024-02-02
  • Rust個人學(xué)習(xí)小結(jié)之Rust的循環(huán)

    Rust個人學(xué)習(xí)小結(jié)之Rust的循環(huán)

    這篇文章主要介紹了Rust個人學(xué)習(xí)小結(jié)之Rust的循環(huán),今天主要了解了Rust語言的3種循環(huán)方法:?loop、while、for,本文結(jié)合實例代碼給大家介紹的非常詳細,需要的朋友可以參考下
    2023-01-01
  • 為什么要使用 Rust 語言、Rust 語言有什么優(yōu)勢

    為什么要使用 Rust 語言、Rust 語言有什么優(yōu)勢

    雖然 Rust 是一種通用的多范式語言,但它的目標(biāo)是 C 和 C++占主導(dǎo)地位的系統(tǒng)編程領(lǐng)域,很多朋友會問rust語言難學(xué)嗎?rust語言可以做什么,今天帶著這些疑問通過本文詳細介紹下,感興趣的朋友一起看看吧
    2022-10-10
  • Rust裸指針的安全性實例講解

    Rust裸指針的安全性實例講解

    裸指針是一個不包含所有權(quán)和借用關(guān)系的原始指針,它們與常規(guī)指針相比沒有任何限制和保護措施,這篇文章主要介紹了Rust裸指針的安全性實例,需要的朋友可以參考下
    2023-05-05
  • 深入了解Rust?結(jié)構(gòu)體的使用

    深入了解Rust?結(jié)構(gòu)體的使用

    結(jié)構(gòu)體是一種自定義的數(shù)據(jù)類型,它允許我們將多個不同的類型組合成一個整體。下面我們就來學(xué)習(xí)如何定義和使用結(jié)構(gòu)體,并對比元組與結(jié)構(gòu)體之間的異同,需要的可以參考一下
    2022-11-11
  • Rust字符串字面值的一些經(jīng)驗總結(jié)

    Rust字符串字面值的一些經(jīng)驗總結(jié)

    字符串有兩種表現(xiàn)形式,一種是基本類型,表示字符串的切片,以&str表示,另一種是可變的string類型,下面這篇文章主要給大家介紹了關(guān)于Rust字符串字面值的相關(guān)資料,需要的朋友可以參考下
    2022-04-04

最新評論