先从安装运行开始,搞出开发环境。
安装
Unix:直接运行
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
安装完成后,就可以创建项目了。
cargo new first
当运行完,就会创建一个名为first的项目文件夹。
默认main.rs里就是经典的 hello world。
fn main() {
println!("Hello world!");
}
接着在Cargo.toml的依赖项里加入reqwest和html2md
[dependencies]
reqwest = { version = "0.11", features = ["blocking"] }
html2md = "0.2"
main.rs修改如下:
use std::fs;
fn main() {
let url = "https://www.rust-lang.org/";
let output = "rust.md";
println!("Fetching url: {}", url);
let body = reqwest::blocking::get(url).unwrap().text().unwrap();
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);
}
这里主要使用了reqwest库用来网络请求,html2md 从名字就能看得出 解析html成markdown格式。
运行
cargo run
会经过一段漫长的编译,开始运行,先请求rust官网,然后解析成markdown写入文件。
可以看到 在rust里项目管理工具 是cargo,类似 Node里的npm, Golang里的go。
rust语法风格
偏C/C++
函数用{}
表达式结束用;
访问结构成员字段,或函数用 .
访问命名空间用::
不想在代码里 使用std::fs() 可以直接use std::fs,这样就可以在代码里直接使用fs()函数了。
入口函数是main()
强类型语言,但编译器也支持类型推导。
rust 还有一些特点:
rust变量默认是不可变的,如果要修改变量的值,需要显式的使用mut关键字。
除了let/static/const/fn 等少数语句外,rust绝大多数代码都是表达式。 所以if/while/for /loop都会返回一个值,函数里的最后一个表达式就是返回值。
支持面向接口,泛型。 Go好像在1.18才支持泛型。
丰富的数据类型和强大的标准库。 (貌似任何一个说自己语言的好的,是不是都可以这么说?)
丰富的控制流 比如 模式匹配(pattern match)
不过个人感觉刚上手有点不是太适应的地方。
fn 虽然简单但是不如写全function
如果代码里使用某些命名空间,头部不能自动导入 use。 这一点go做的相对自动一些。
感觉既然是强类型,就不要松开类型推导这个口子。不然有点混乱,
总体感觉就是 既要还要。
明天接着学 Rust的基本语法和数据结构。