Rust学习笔记/基础

renyuneyun 2018年07月08日(周日) 1 mins

包管理器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似乎并没有专门的“声明”语法
  • 函数可以进行多值返回,多个返回值使用 () 括起来
  • 可以使用“解包”操作将多个值直接赋值给相同数量的变量
    • 这里实际上是返回了一个 元组 (见 数据类型 部分)
  • 已声明的变量可以被重新声明,以覆盖原有的变量(常用于转换类型)

您可以在Hypothesis上的該群組內進行評論,或使用下面的Disqus評論。