Rust能力养成之(1):与众不同的初始化

图片

前言

之前写过了三篇介绍Rust语言的文章(样样精通的Rust与其内功心法),想必大家也都认识到该语言的能力,用途,以及前景之光明了,于是自本文起,笔者开始着力撰写一个自下而上的培养rust编程能力的文字系列。

在此很感谢相关老师,朋友的支持,让我有动力进行这方面内容的写作,同时也期待读者朋友们于日后的积极互动,以令这方面的内容达到最佳优化,那么,一个教学互长的历程便由此开展。

从这里开始,让我们从零开始学习Rust。

本文将介绍

  • Rust的安装与编译

  • Rust基本数据类型

  • 变量声明和不可变绑定

Rust的安装与编译

安装

就安装方式而言,推荐使用rustup,无论是新装,升级还是降低版本都很便利。Windows系统的话,可以下载如下的exe文件:

(https://www.rust-lang.org/tools/install)

图片

如果是linux系统可以终端键入如下命令

curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh

余下步骤按照提示即可。

图片

开发环境

本文大部分代码都在Windows10环境下使用vscode编辑器完成。

图片

编译

在rust中,通常有两种编译方式

  • 第一,对于单独脚本,使用rustc filename.rs

  • 第二,在工程管理视野下,使用cargo run(后续会详谈)

本文中,为了便于演示,是在vscode中,添加了rust-analyerrun code插件,通过鼠标点击进行编译并查看结果,这应该是很符合入门级别的习惯。

图片

当然,许多小代码文件,可以到playground去跑一下

https://play.rust-lang.org/

图片

第一阙代码

为了避免俗套,就不写Hello World!了,我们看以下代码(greet.rs)。在Rust中,所有代码都以 fn main(){}开始写起。

//greet.rsuse std::env;fn main() {
   
      let name = env::args().skip(1).next();   match name {
   
           Some(n) => println!("Hi there ! {}", n),        None => panic!("Didn't receive any name ?"),    }}

解释代码

  • 行2:从标准库std crate(在rust中,库-library,被称为crate)中导入模块(module)env

  • 行4:调用env中的args()函数,以返回一个迭代器性质的参数序列,

    • 由于序列的第一个参数包含路径的信息,没必要在这里显示,就利用skip(1)跳过该参数,

    • 由于迭代器是惰性的,不会预先计算,需要用next()来指定。

      • next()返回一个枚举类型(enum type)的称为Option选项的量

      • 这个量会与后续的Some(value)的值或者None的值相对应。

  • 行5:match 是rust中很赞的表达式,类似于C中的switch-case,用于判断是否name在以下的语句中存在,

  • 行6:当Some(n),也就是存在一些值时,把值传给n,调用println!,显示所谓的greet结果,

    • println!,有叹号,可见是个宏(macro),不是函数

  • 行7:表明如果返回的枚举类型是none,则调用 panic!,进行报错。

代码结果

图片

谈一下println!宏

从以上代码可见,该宏接收字符串,并予以显示。

这里有些格式问题,需要谈一下:如果显示的数据类型为基本数据类型(primitives),使用大括号"{}";如果是其他数据类型使用"{:?}"

前者涉及Display特性(trait),后者涉及Debug特性(这意味着有时候需要 #[derive(Debug)] 属性,当该方法有时并未为某些类型具备时)。

此处剧透一下,涉及这方面详细内容,会在后续的源语言编程(Metaprogramming with Macros)中介绍。

 

基本数据类型(Primitive types)

 

这里给出rust的内建基本数据类型,大家可以同其他语言进行对照,不难理解。

  • 布尔,bool

  • 字符串,char

  • 整型,目前支持到128bits,具体有:

图片

  • isize:32-bit 或者 64-bit的带符号整形指针

  • usize:32-bit 或者 64-bit的无符号整形指针

  • f32:32-bit浮点

  • f64:64-bit浮点

  • [T; N], 定长数组,T为数据类型,N为长度或者规格(size)

  • str:字符串,通常使用其引用&str

  • (T, U,..): 有限序列,T and U 可以是不同类型

  • fn(i32) -> i32: 是一个函数,这里该函数输入类型为i32,返回值类型为i32;以此可见,函数的类型也有了明确而显式的定义

变量声明与不可变绑定

(Declaring variables and immutability)

 

在Rust中,使用let关键词来声明变量。在时下一些主流的命令式语言(imperative language)中,如C或Python,初始化一个变量不会影响你在下一步中重新对其赋值。

然而,Rust在这里与主流分道扬镳,这意味着,如果你已经为一个变量初始化,则不能再把该变量赋予其他的值。

但如果你还是需要将一个变量赋予新值,则需用使用mut关键字。这里就体现出Rust的一个特色,那就是尽可能让你在编程时思路清晰。

我们看以下代码,其中target 是不可变绑定,greeting是可变绑定。第7行中,target被重新赋值为mate。

//variables.rs fn main() {
   
       let target = "world"; //no mut    let mut greeting = "Hello";    println!("{}, {}", greeting, target);    greeting = "How are you doing";    target = "mate";    println!("{}, {}", greeting, target);}

从下面结果看来,没有编译成功,原因是,不能为不可变绑定变量赋值两次

图片

于是,在第2行 为变量target加上mut,如下所示。

fn main() {
   
       let mut target = "world"; //add mut    let mut greeting = "Hello";    println!("{}, {}", greeting, target);    greeting = "How are you doing";    target = "mate";    println!("{}, {}", greeting, target);}
编译成功,结果表明以上的两个可变绑定,都获得了各自的二次赋值。

图片

结语

 

希望读者朋友这里注意一下,不可变绑定和可变绑定在Rust中具有重要地位,事关安全效率等问题,后续篇章会着重论述。

本文从零开始,引入了一些Rust的基本元素和适当的代码,并没有实行快速行进的教程方式,因为该语言虽然也没有C那么难学,也并不像Python那么容易学习,但本着先练好基本功的原则,开始阶段,会采取慢慢讲的方式。

当然,对读者还是有些要求,希望最好能够了解一种以上的主流编程语言,如C或Python,这样更容易进入状态。

下一篇,会开始讲一下函数。

主要参考和建议读者进一步阅读的文献

https://doc.rust-lang.org/book

1.Rust编程之道,2019,张汉东

2.The Complete Rust Programming Reference Guide,2019,Rahul Sharma,Vesa Kaihlavirta,Claus Matzinger

3.Hands-On Data Structures and Algorithms with Rust,2018,Claus Matzinger

4.Beginning Rust ,2018,Carlo Milanesi

5.Rust Cookbook,2017,Vigneshwer Dhinakaran

猜你喜欢

转载自blog.csdn.net/qq_40433634/article/details/111934816
今日推荐