當前位置: 華文世界 > 科技

學Rust, 進華為! 了解Rust 語言的println!的幾種用法

2024-02-15科技

學Rust, 進華為!

最近Rust 的發展十分迅速。 2021 年2月9日 Mozilla Amazon 華為、谷歌、微軟作為創始白金 成員共同成立 Rust 基金會 ,這五家創始公司公開承諾,每年對Rust投資,不會少於 100 萬美元,每年的預算不少於 100萬美元,兩年內每年投入100 萬美元,用於開發、維護和推廣 Rust 語言計畫。

可見, 華為對於Rust 語言的支持,那絕不是像某些公司的研發費用一樣隨便說說, 這些可都是真金白銀的支出!而且還是美元!

可能很多人對 Rust 基金會創始成員中出現華為感到驚訝,因為很多人,並沒有太多地了解華為對於Rust 計畫的支持, 事實上,華為有很多用 Rust 編寫的產品,比如 StratoVirt:

據華為虛擬化高級工程師道一介紹:

StratoVirt是面向雲數據中心的企業級虛擬化VMM解決方案。 它提供了支持虛擬機器 (VM)、容器和Serverless三種場景的統一架構,在輕量低噪、軟硬整合、Rust語言級安全等方面,具備關鍵技術優勢

StratoVirt

StratoVirt 架構圖:

有關StratoVirt更加詳細的介紹,可以看這個視訊:

StratoVirt 面向openEuler的輕量級虛擬化平台 吳斌_嗶哩嗶哩_bilibili

華為在開發StratoVirt 時, 為什麽選擇Rust 呢? 據華為高級開發經理徐飛介紹, 華為分析QEMU 計畫的bug 列表中分析得出, 一半以上的嚴重問題都是由於C 語言的記憶體問題導致的, 因此, 他們選擇了專註於記憶體安全的Rust 語言。

而StratoVirt 也不負眾望,在Rust 語言的助力下, 做到了強安全性和隔離性, 而這個特性,對於統一支撐虛擬機器、容器和Servless三種場景的企業級虛擬平台而言,這無疑是最為看重的特性!

StratoVirt 計畫的Git地址: https://gitee.com/openeuler/stratovirt

在華為內部,也有大量計畫使用Rust 進行開發, 華為更是選定了Rust 作為華為可信計算的程式語言!

所以說, 如果想進入華為公司工作, 那麽, 熟練掌握Rust 語言,無疑會增加自己的競爭力!

來看一則華為的招聘資訊:

看看下面的華為的招聘,指名招聘Rust 工程師,要求為3年編程經驗, Rust語言的要求為最少一年:

  • 3+ years of professional software development experience including a minimum 1+ year specifically of Rust development
  • High proficiency with RUST must be able to write strong/ clean, brand-new code
  • 學Rust語言, 進華為工作!

    今天來介紹Rust 語言中的數據輸出宏println!, 值得註意的是, println!並非函式,而是一個宏定義。今天主要來熟悉println!輸出時候的各種主要用法。

    建立計畫

    首先,建立一個新計畫:

    cargo new println_intro

    隨後在在code中開啟這個計畫:

    $ cargo new println_intro

    Created binary (application) `println_intro` package

    learn_rust % cd println_intro

    println_intro % code .

    println! 講解

    然後,我們在main.rs中輸入下面程式碼:

    fn main() { let x = 1; println!("x的值是{x}");}

    在第3行, 我們可以看出, 之前的大部份程式碼,都使用{x}的方式來打印變量的值。

    今天,我們來學習一些println!新的方式。

    使用{} 來打印變量

    首先來看程式碼:

    fn main() { let x = 1; println!("x的值是{}",x);}

    在這裏, 我們使用的大括弧「{}」是空的, 在這種情況下, x的內容會被轉換成String型別, 並在「{}」中打印。

    需要註意的是, 當使用"{}"的方式打印變量時, 逗號「,」後面的變量和「{}」是一一對應的,可以跟多個變量,例如:

    fn main() { let x = 1; println!("x的值是{},x+1的值是{}",x,x+1);}

    結果:

    使用位置參數{0}

    除了使用空的"{}"外, println!還可以使用位置參數,透過"{0}"中的數位,指明位置參數, 來看程式碼:

    fn main() { let x = 1; let y = 2; let z = 3; println!("x的值是{2},y的值是{1},z的值是{0}",z,y,x);}

    來檢視結果:

    使用命名參數

    來看程式碼:

    //使用命名參數 println!("{a}{b}{c}",a="我",b="愛",c="Rust語言");

    執行結果:

    指定顯示寬頻

    可以使用width來指定顯示寬度:

    println!("打印數位1,註意數位1前面的空格{number:>width$}", number=1, width=6);

    檢視結果:

    這裏顯示的文本是右對齊, 因為我們在程式碼中要求":>width$", 而且傳入的width的長度是6, 所以在打印出來的結果中,1 前面就有5個空格:

    打印的數位前補齊0

    在一些金融場景中,數位前面如果有空格,就需要用0來補齊,下面我們來看一下Rust中如何補齊:

    println!("打印數位1,註意1前面的補齊{number:>0width$}", number=1, width=6);

    在程式碼中, 我們用":>0width$"的方式,指明要補齊6位數位:

    動態執行結果:

    打印二進制格式

    最後,來看看使用「:b」打印二進制。

    首先來看程式碼:

    println!("只有{} 分之 {:b} 的人知道二進制, 其他的人都不知道。", 1, 2);

    下面的結果可能會讓很多人驚訝,因為2這個值並沒有打印出來:

    2在結果中,顯示為「10」,假如我們把數位改成8, 則結果顯示為「1000」:

    因為":b"就是顯示變量的二進制結果, 2的二進制表示為「10」,而8的二進制則是「1000」,如果改成10, 則顯示結果就是「1010」, 這樣大家就明白了吧。

    最後

    本文介紹了Rust 語言的println!宏的格式化打印的幾種情況。作為Rust 學習者和開發者, 了解格式化打印是非常重要的。

    同時, 還展示了華為的一則招聘資訊, 華為公開招聘Rust 程式設計師, 如果覺得英語水平過關的話,不妨前去應聘哦!

    本文程式碼已經送出到Github, 地址:https://github.com/hintcnuie/learn_rust