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

链接:https://indeex.club

著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

发表评论

您的电子邮箱地址不会被公开。