概述
前言
之前写过了三篇介绍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-analyer和run code插件,通过鼠标点击进行编译并查看结果,这应该是很符合入门级别的习惯。
当然,许多小代码文件,可以到playground去跑一下
https://play.rust-lang.org/
第一阙代码
为了避免俗套,就不写Hello World!了,我们看以下代码(greet.rs)。在Rust中,所有代码都以 fn main(){}开始写起。
//greet.rs
use 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
最后
以上就是着急口红为你收集整理的Rust能力养成之(1):与众不同的初始化前言Rust的安装与编译的全部内容,希望文章能够帮你解决Rust能力养成之(1):与众不同的初始化前言Rust的安装与编译所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复