包管理器Cargo的基本使用
Rust官方提供了包管理器Cargo,且Cargo同时负责项目的初始化、构建等功能。建议的做法是使用Cargo初始化项目,然后进行编写,之后使用Cargo进行构建。故而,这里简单介绍如何用Cargo完成这两项功能。
创建项目
$ cargo new YOUR_DIR --bin
该命令会在当前目录下生成 YOUR_DIR
这个新目录,其中包含新项目的“模板”文件(即示例)。之后的命令基本均在该目录下进行。
注意这里的 --bin
要求Cargo创建一个二进制/可执行项目; --lib
或留空均会创建库项目。
在 YOUR_DIR
目录下有一个名为 Cargo.toml
的文件。该文件是项目的(Cargo)配置文件,用来描述项目的依赖关系、控制编译/构建过程等。
编译并执行项目
$ cargo run
Rust基本语法
Rust是一门强类型、手动类型的语言,这意味着函数参数需要显式地声明参数类型(以及返回值类型)。但Rust支持类型自动推导,在声明并初始化变量时可以通过类型自动推导而省略变量类型。整体而言,Rust的语法承袭自C家族。
Hello world
类似于C,Rust程序开始于 main
函数:
fn main() { println!("Hello, world!"); }
在Rust中,main
函数是一个没有参数没有返回值的函数。可以看到:
fn
声明一个函数- 大括号/花括号
{}
用来标记代码块 - 分号
;
作为语句结束符
注意到这里输出所用的 println!()
是一个 宏 ——其中的感叹号 !
正是宏的标识(定义宏时编译器自动添加)。Rust的 宏 更贴近Lisp系的宏,不在本文中介绍。
函数、参数及类型声明
fn my_awesome_function(x: i32) -> i32 { x + 1 }
- Rust的数据类型在变量名称之后,使用冒号分隔
- 函数返回值使用
->
标记 - 函数最后一行 表达式 作为函数的返回值
- 但也可使用return,写成 语句
注意 表达式 和 语句 的区别,语句不返回值。
变量声明及代码块
(部分代码段抄自 The Rust Programming Language (Second Edition) )
fn main() { let a: float32; a = 30.4; let x = 5; let y = { let x = 3; x + 1 }; println!("a={} x={} y={}", a, x, y); }
- 使用
let
进行变量的声明 - 如之前所说,变量的类型在变量名之后
- 当编译器可以进行自动推导时,变量的类型可以省略
- 使用
- Rust使用
{}
划分代码块,每个代码块划分一个作用域 - 内部代码块/作用域可以通过再次声明变量,以临时覆盖外部变量的值
- 每个代码块被视为一个 表达式 ,(同函数一样)使用其内部的最后一个表达式作为其值
可变性
fn main() { let x = 5; x = 1; // 本行会报错,删除本行解决问题 let mut y = 2; y = 8; println!("x={} y={}", x, y); }
- Rust的变量默认为 不可变 (类似于const/final),函数参数也是如此
- 如要使其可变,需要在其名称前面加上
mut
杂项(可不看)
fn multi() -> (i32, i32, f32) { let x: i32; let y = 3; let z; x = 20; z = 50.0; (x, y, z) } fn main() { let (a, b, c) = multi(); println!("a={0} b={1} c={2}", a, b, c); }
- 函数的声明/定义顺序不重要
- 并且Rust似乎并没有专门的“声明”语法
- 函数可以进行多值返回,多个返回值使用
()
括起来 - 可以使用“解包”操作将多个值直接赋值给相同数量的变量
- 这里实际上是返回了一个 元组 (见 数据类型 部分)
- 已声明的变量可以被重新声明,以覆盖原有的变量(常用于转换类型)
Backward links:
您可以在Hypothesis上的該群組內進行評論,或使用下面的Disqus評論。