Rust是一种全新的系统编程语言。Rust语言基于编译时安全。由于没有其他语言附带的GC,Rust也是一门性能可与C媲美的高性能语言。近年来,Rust被开发者广泛采用,一直是最流行的语言,也是开发者最想要的语言学习多年。Rust是C/C++最有前途的替代品之一。当然Rust也有缺点,就是学习曲线比较曲折,对初学者不是那么友好。在这篇文章中,虫虫将为大家分享一些Rust语言初学者的编程技巧,希望对大家有所帮助。Racer、Clippy、rustfmt和fix是一组非常有用的工具。Racer用于帮助您完成Rust代码。可以使用cargo安装racer:cargoinstallracerracer需要先获取Rust源码路径,可以通过rustup获取源码:rustupcomponentaddrust-srcrustupupdate随时获取最新代码。Clippy可以捕获代码中的各种lint,检查代码是否符合rust惯用语,authentic不真实,高效还是不高效?安装Clippy,运行rustupcomponentaddclippy,然后在工作区运行Clippy:cargoclippy--tests---Wclippy::cargo可以通过执行命令行参数或clippy.toml配置文件来指定clippy检查:rustfmt是一个工具根据样式格式化Rust代码。要安装rustfmt,请使用:rustupcomponentaddrustfmt,然后在工作区中运行rustfmt:cargofmt。同样,rustfmt.toml可以用来配置rustfmt的样式:cargofix工具可以自动修复编译器中的警告项。同名、同函数、同类型的宏熟悉Rust的同学可能都知道,Rust最强大的功能之一就是宏,比如你好,虫虫例子:fnmain(){println!("Hello,虫虫");}println!()是一个宏。在Rust中,我们可以声明一个宏、一个函数和一个具有相同名称的类型,然后使用单个import语句将它们导入到其他文件中。DBG!宏DBG宏可以用来显示表达式和值的计算过程,可以用来快速调试一些代码表达式。例如:leta=2;etb=dbg!((a+3)*2)+1;assert_eq!(b,11);上面的代码会打印:[dbg.rs:3](a+3)*2=10错误类型转换直接使用rust的错误处理可能不够灵活。使用unwrap()会在发生错误时触发panic,导致程序挂起。很多时候这不是我们所期望的。这是一个例子,fnmain(){letpath="/tmp/example";println!("{}",read_file(path));}fnread_file(path:&str)->String{std::fs::read_to_string(path).unwrap()}如果/tmp/example不存在,会触发panic错误:thread'main'panickedat'called`Result::unwrap()`onan`Err`value:Os{code:2,kind:NotFound,message:"Nosuchfileordirectory"}',ok.rs:7:5note:runwith`RUST_BACKTRACE=1`environmentvariabletodisplayabacktrace还好我们可以用?,错误返回可以转换成Err(From::from(err))和Ok(ok)分支,以便将错误转换为自动类型。部分代码如下,可以自定义错误信息CustomError:fnmain()->std::result::Result<(),CustomError>{letpath="/tmp/example";letv=read_file(path)?;Ok(())}模块化测试想象一下,你的项目的测试结构如下:tests/aaa.rsbbb.rs测试时,这些每一个都会被编译成一个单独的二进制文件,这将花费大量的时间编译时间和空间。这些测试文件可以作为模块添加到测试中,以便只生成一个二进制文件。新的测试结构如下:tests/all/mod.rs//modaaa;modbbb;aaa.rsbbb.rsmod.rs//modall;使用这种技术可以大大减少编译时间,节省时间和空间,提高效率。当然它也有缺点,不能测试单个文件,只能统一编译文件。即使只更改了一个测试文件,它也会编译完整的项目文件。编译器缓存Rust编译器cargo只支持工作空间内项目之间的编译缓存,不支持工作空间之间的编译缓存。对于使用相同依赖项的多个工作区中的多个项目,单独编译它们需要额外的时间。我们可以借助货物缓存工具sccahe来解决这个问题。sccache是类似于ccache的cargo的编译器缓存。编译一次依赖项,然后在所有项目中重用它。可以大大节省编译时间和磁盘空间。sccache除了将编译后的构建存储在本地外,还支持存储在云端,如AWSS3或GCS。您可以使用操作系统包管理器或cargo安装sccache:cargoinstallsccache。windows下可以使用scoopinstallsccache使用sccache来缓存rust编译,需要在cargo配置文件(~/.cargo/config)中定义build.rustc-wrapper:[build]rustc-wrapper="/path/to/sccache”也可以在编译时直接设置RUSTC_WRAPPER环境变量:RUSTC_WRAPPER=/path/to/sccachecargobuild以避免不必要的克隆。在rust中对变量调用.clone()将为它创建数据副本。创建数据副本会消耗大量的内存资源,因此在大多数情况下会影响程序的性能,应该避免。通常,您可以使用应用程序引用而不是创建克隆。例如:fnmain(){letx=Foo::new();func(x.clone());func(x.clone());//clone是不需要的fnmain(){letx=Foo::new();func(x.clone());func(x);//这会很好用,因为你不需要//tousexafterthiscall}使用:fnmain(){letx=Foo::new();func(&x);func(&x);}枚举大小受最大成员限制枚举的大小使其能够容纳其最大变体。因此,建议在枚举中使用类似大小的变体,以避免内存布局不理想。如果需要,考虑装箱更大的变量。考虑以下示例:enumFoo{A(u64),B([u64;1000]),}enumFooBoxing{A(u64),B(Box<[u64;1000]>)}fnmain(){letx=Foo::A(0);//大小8008字节lety=FooBoxing::A(0);//16字节println!("Foosize{:?}",std::mem::size_of_val(&x));println!("FooBoxingsize{:?}",std::mem::size_of_val(&y));}在上面的示例中,枚举Foo的变体A的大小比变体B小得多,但用于两者的内存布局变体的数量将相同,因此当使用变体A时,其性能不会很理想。标准的swap函数,rustswap函数,允许两个变量直接交换而不创建临时变量。usestd::mem;letmutx=5;letmuty=42;mem::swap(&mutx,&muty);assert_eq!(42,x);assert_eq!(5,y);结论Rust语言中使用的技巧很多,可以参考.希望这篇文章能对您有所启发,给您一些启发。如果你有更好的技巧和实用方法,欢迎回复本文。
