Web Rust基础一
介绍
Web开发者使用的底层编程语言,在某些场景下,性能高于C++。
这里是多年前(大概2015年左右,那时候还在艰难的推广React库😭)的使用总结。
安装
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
安装完成后
//升级
rustup update
//查看版本
cargo --version
构建和包管理
cargo build// 可以构建项目
cargo run// 可以运行项目
cargo test// 可以测试项目
cargo doc// 可以为项目构建文档
cargo publish// 可以将库发布到 crates.io
Vscode
安装 rust 插件
新建项目
cargo new hello-rust
Cargo.toml 为 Rust 的清单文件。其中包含了项目的元数据和依赖库。
src/main.rs 为编写应用代码的地方。
运行
cargo run
添加依赖
在 Cargo.toml 文件中添加
[dependencies]
ferris-says = "0.2"
重新运行
这时会生成一个Cargo.lock文件
使用依赖
删除main.rs里所有内容,添加以下内容:
use ferris_says::say;
重新运行
hello app
继续添加以下内容:
use ferris_says::say;
use std::io::{stdout, BufWriter};
fn main() {
let stdout = stdout();
let message = String::from("Hello fellow Rustaceans!");
let width = message.chars().count();
let mut writer = BufWriter::new(stdout.lock());
say(message.as_bytes(), width, &mut writer).unwrap();
}
重新运行
结果:
----------------------------
< Hello fellow Rustaceans! >
----------------------------
\
\
_~^~^~_
\) / o o \ (/
'_ - _'
/ '-----' \
模块
初始化
rust 中,最基本的模块(编译单元)称为 crate(可翻译为:集装箱),可以在命令行中创建一个新的 crate :
cargo init --bin hello-indeex
在 hello-indeex 目录中创建一个 hello indeex 模块。模块是 bin 类型的可编译出可执行程序。初始项目中主要包含两个文件:
Cargo.toml 文件是模块配置文件;
src/main.rs 是代码文件,包含主体代码逻辑。
src/main.rs:
fn main() {
println!("Hello, indeex!");
}
fn main程序入口。
println!类似ts/js/as中的console/trace,但实际使用很少,通常会使用第三方模块或依赖。
运行命令,会在target中生成debug相关文件,并在终端看到Hello, world!:
cargo run
发布命令,会在target中生成release相关文件:
cargo build --release
模块
开源模块类似Web开发中的NPM开源包,rust开源包地址 https://crates.io
log模块
目前rust没有像node那种npm install安装模块的命令,需要在Cargo.toml中手动添加:
[dependencies]
log = "0.4.14"
env_logger = "0.9.0"
env_logger是在命令行中配合 log 模块一起使用
引入模块
#[macro_use]
extern crate log;
修改main.rs:
env_logger::init();
let str = ["indeex", "hk"];
info!("{:?}", str);
warn!("{:?}", str);
error!("{:?}", str);
trace!("{:?}", str);
debug!("{:?}", str);
{:?} 表示的是输出“调试信息”,rust认为数组并不应该直接展示给用户,所以不能用普通地用 {} 来输出,必须用 {:?} 来输出,而且只应当作为调试信息使用,如果只想得到值:
// dbg!(&str);
info!(&str);
可以绑定环境:
//非win
export RUST_LOG=warn
//win
set RUST_LOG=warn
也可以不绑定:
RUST_LOG=info ./src/main.rs
数据类型
无符号整型 u8 u16 u32 u64 u128 ,它们分别表示 8 ~ 128 位整数
还有一个无符号整型 usize ,表示位数与系统位数相同,在 32 位系统中 usize 是 32 位整数,在 64 位系统中则是 64 位整数
整型 i8 i16 i32 i64 i128 isize ,位数含义同上
浮点型 f32 f64 ,位数含义同上
布尔型 bool ,其值可为 true 或 false
字符串 String ,默认UTF-8 编码的字节序列
Tuple元组,将几个值组合在一起,这几个值可以是不同类型
Array数组,数组可以用于将多个值组合在一起,但必须是相同类型的,类似Javascript实现中的Vector数组
//数值类型
let num1: u8 = 1;
let num2: f32 = 10.1;
//字符串
let str = "indeex";
//布尔
let b: bool = true;
println!("{}", num1);
println!("{}", num2);
println!("{}", str);
println!("{}", b);
let b: bool = false;
println!("{}", b);
//类型转换
let c = num1 as f32 * num2 * 2.0;
println!("{}", c);
//元组
let tuple1: (f32, u32) = (10.5, 2);
let tuple2: (f32, _) = (12.5, 3); //也可以只写一部分,省略的部分可以用 _ 表示
println!("{}", tuple1.1);
let (tp11, tp12) = tuple1; //解构
let (tp21, tp22) = tuple2;
println!("{}", tp11);
println!("{}", tp12);
println!("{}", tp21);
println!("{}", tp22);
//数组
//定长数组
let arr: [u32; 4] = [1, 2, 3, 4];
let arr1: [u32; 4] = [1; 4];
println!("{}", arr[3]);
// 下标可以是变量,但是必须是 usize 类型的
let index: usize = 0;
println!("{}", arr1[index]);
//不定长数组,可以使用push pop等方法
let vec: Vec<u32> = vec![100, 200, 300, 400];
println!("{}", vec[index]);
println!("{}", vec.len());
//字符串
let str1: String = String::from("这是字符串");
println!("{}", str1);
let a = "hello";
let b = "indeex";
let str2 = format!("{}空格{}", a, b); //format!类似printIn!
println!("{}", str2);
let word = format!("X");
println!("{}", word.len()); //英字占字节数
let hanzi = format!("字");
println!("{}", hanzi.len()); //汉字占字节数
let str3 = format!("这样搜索字符");
println!("{}", str3.chars().nth(3).unwrap()); //开销大
//克隆字符串
let str_clone = format!("ABC");
let str1_clone = str_clone.clone();
println!("{}", str1_clone);
let str_clone = format!("XYZ");
println!("{}", str_clone);
//引用
//不可变引用
let str4 = format!("EFG");
{
let str5: &String = &str4; // 不可变引用str5
let str6 = &str4; // 另一个不可变引用str6
println!("{} {}", str5, str6);
}
//可变引用
let mut str7 = format!("ABC");
{
let str8: &mut String = &mut str7;
*str8 = format!("DEF");
}
println!("{}", str7);
//去除空格
let white_str = format!(" HIJ ");
let w_str: &str = white_str.trim();
println!("{}", w_str);
//带转义符字符串
let str10: &str = r#"
这是一行。
这又是一行。
"#;
println!("{}", str10);
code enjoy! 🐜🐜🐜
作者:indeex
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。