当前位置: 华文世界 > 科技

学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