默认标题_公众号封面首图_2021-09-03+14_04_24.png

语言类型

静态类型 vs 动态类型

Rust是一门预编译静态类型语言,它的编译和运行是分开的两个过程,在编译时会生成一个二进制文件,这个文件可以拿到任何一个系统中执行。
下图中的main就是编译后生成的可执行文件。
image.png

JavaScript是一门动态解释执行型语言。J的编译和执行是没有区分开来的,JS的编译发生在执行前的几秒中,甚至是执行中,而且这个编译其实和Rust的编译也不同,他不会生成额外的可执行文件。

Cargo简介

Rust 使用叫做cargo的工具来进行项目管理。类似于前端常用的npm,用来管理依赖的版本以及开发过程中的过程管理,包括编译、运行和测试、代码格式化等。

因为类似于npm,所以在项目中我们执行的相关命令都差不多,只需要把npm —> cargo 比如: npm run build—-> cargo build

使用Cargo构建项目

运行命令 cargo new hello_rust,即可创建命令

这里需要注意一下cargo建议开发者项目名称使用下划线的形式命名。

  • cargo new 创建的是一个二进制程序模板
  • cargo new [project_name] --lib 创建的是一个库项目

    使用cargo生成的项目会生成一个配置文件cargo.toml,该文件格式为toml格式。 该文件的作用类似于前端项目中的package.json,来进行一些项目的配置和所需要依赖包的管理

  1. # Cargo.toml
  2. [package]
  3. name = "hello-rust"
  4. version = "0.1.0"
  5. edition = "2018"
  6. # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
  7. [dependencies]
  8. reqwest={ version= "0.11", features = ["blocking"]} # reqwest库,版本为0.11
  9. html2md = "0.2" # html2md库,版本为0.2
  • [package]:片段(section)标题,表明下面的语句用来配置一个包
  • [dependencies]:项目所需要的依赖。在Rust中代码包被称为crates

使用Cargo构建运行项目

  1. 运行**cargo run**会对代码进行编译并且运行生成的可执行文件。

image.png

  1. 运行**cargo build**即可进行项目的构建,构建结果会放在**target**目录下

image.png
image.png

  1. 运行**cargo check**,可以进行代码的快速检查确保其可以编译,但是不会生成可执行文件。该命令与**build**命令相比会更加快,毕竟不需要生成额外的文件。

image.png

语法概览

接下来用代码编写一个程序来看一下Rust语法的大致结构,目前可以不用深究每行代码的意义。

下面的代码实现的是获取rust官网的html,并生成对应的md文档

use std::fs;

fn main() {
    let url = "https://www.rust-lang.org/";
    let output = "rust.md";

    // 抓取html文本
    println!("Fetching url: {}",url);
    let body = reqwest::blocking::get(url).unwrap().text().unwrap();

    // 将获取到的html转换为md
    println!("Converting html to markdown...");
    let md = html2md::parse_html(&body);

    // 写入文件
    fs::write(output, md.as_bytes()).unwrap();
    println!("Converted markdown has been saved in {}.", output);
}
  • Rust整体语法偏向C/C++
    • **main**函数是一个特殊的函数,在执行Rust程序中,它总是最先执行的
    • 函数体用花括号{ }包裹
    • 表达式之间用分号;分割(不像js,可以加分号可以不加,rust是必须要每行加分号)
    • 访问结构体的变量或者方法使用点**.**
    • 访问命名空间或者对象的静态函数用双冒号**::**
      1. 命名空间:和ts里的nameSpace差不多的意思
      2. 结构体:C里面的一种数据结构,可以理解为JS里面的对象,和JS里对象访问属性的方法一样,是通过点来访问的
      3. 静态函数:如果在一个源文件中定义的函数,只能被本文件中的函数调用,而不能被同一程序其它文件中的函数调用,这种函数称为内部函数。 关键字“static”,译成中文就是“静态的”,所以内部函数又称静态函数

对于上面的功能我用js实现了一遍,可以对比来看一下

const axios = require('axios')
const { Sitdown } = require('sitdown')
const fs = require('fs')
const tomd = new Sitdown()

async function main() {
  const url = 'https://www.rust-lang.org/'

  console.log('get html from url...')
  const body = await getBody(url)

  console.log('html to markdown...')
  const md = tomd.HTMLToMD(`${body}`)

  console.log('write file...')
  fs.writeFile('./rust.md', md, (err) => {
    if (err) console.log(err.message)
  })
}

/**
 * 请求数据
 * @param {*} url
 * @returns data
 */
async function getBody(url) {
  const response = await axios.get(url)
  return response.data
}

main()

整体看下来就是会发现:

  1. Rust代码量更少,并且内置了很多像fs这种标准库,不需要再安装依赖
  2. Rust遵循函数式编程的规则