语言类型
静态类型 vs 动态类型
Rust
是一门预编译静态类型语言,它的编译和运行是分开的两个过程,在编译时会生成一个二进制文件,这个文件可以拿到任何一个系统中执行。
下图中的main
就是编译后生成的可执行文件。
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
,来进行一些项目的配置和所需要依赖包的管理
# Cargo.toml
[package]
name = "hello-rust"
version = "0.1.0"
edition = "2018"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies]
reqwest={ version= "0.11", features = ["blocking"]} # reqwest库,版本为0.11
html2md = "0.2" # html2md库,版本为0.2
[package]
:片段(section)标题,表明下面的语句用来配置一个包[dependencies]
:项目所需要的依赖。在Rust
中代码包被称为crates
。
使用Cargo构建运行项目
- 运行
**cargo run**
会对代码进行编译并且运行生成的可执行文件。
- 运行
**cargo build**
即可进行项目的构建,构建结果会放在**target**
目录下
- 运行
**cargo check**
,可以进行代码的快速检查确保其可以编译,但是不会生成可执行文件。该命令与**build**
命令相比会更加快,毕竟不需要生成额外的文件。
语法概览
接下来用代码编写一个程序来看一下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是必须要每行加分号) - 访问结构体的变量或者方法使用点
**.**
- 访问命名空间或者对象的静态函数用双冒号
**::**
- 命名空间:和ts里的nameSpace差不多的意思
- 结构体:C里面的一种数据结构,可以理解为JS里面的对象,和JS里对象访问属性的方法一样,是通过点来访问的
- 静态函数:如果在一个源文件中定义的函数,只能被本文件中的函数调用,而不能被同一程序其它文件中的函数调用,这种函数称为内部函数。 关键字“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()
整体看下来就是会发现:
Rust
代码量更少,并且内置了很多像fs
这种标准库,不需要再安装依赖Rust
遵循函数式编程的规则