从安装开始
下载:https://www.rust-lang.org/zh-CN/tools/install
直接打开,按照默认即可。如果很慢就关掉,输入:
> $env:RUSTUP_DIST_SERVER="https://mirrors.tuna.tsinghua.edu.cn/rustup"> $env:RUSTUP_UPDATE_ROOT="https://mirrors.tuna.tsinghua.edu.cn/rustup/rustup"输入
> rustc --version出现版本号就成功了。
Hello World
创建一个程序:
> cargo new HelloWorld> cd .\HelloWorld\可以先安装下 GNU 工具链:
> rustup toolchain install stable-gnu> rustup default stable-gnu然后输入 cargo run 运行程序,程序会输出 Hello, world!
变量
定义(要修改需要加上mut 标识符):
let a = 10;赋值后不可修改const PI: f64 = 3.14159;常量
类型:i32,u64,i128,f64,bool,char
元组(固定长度不同类型):let sb = ("str" , 114 , 5.14);(取值用sb.0 )
数组(固定长度相同类型):let nums: [i32 ; 3] = [1 , 2 , 3];
函数
fn f(n: i32) -> i32 { //函数体 if(n == 0) return 1; return f(n - 1) * n;}fn add(a: i32 , b: i32) -> i32{ //表达式,返回 a + b a + b}顺序/循环 结构
- if,没什么特别的,没有括号,其他和 c 一样。
loop无限循环,用break退出。while i < 3 { i += 1; }for i in 1..4 { println!("for {}" , i); }遍历 1~3
进阶
速通完 rust,来尝试编写一个桌面应用程序吧!
eframe
1. 窗口创建
打开 Cargo.toml 添加依赖:eframe = "0.27"
然后来到 src/main.rs 在第一行导入库:use eframe::egui;
fn main() -> Result<(), eframe::Error> { let options = eframe::NativeOptions::default(); eframe::run_native("My egui App", options, Box::new(|cc| Box::new(QWQ::new(cc))));}这里解释下 run_native:
pub fn run_native( title: &str, native_options: NativeOptions, app_creator: impl FnOnce(&CreationContext) -> Box<dyn App> + 'static,) -> Result<(), Error>native_options 表示窗口配置,比如窗口大小,是否全屏,图标等。代码里是默认值。
app_creator 是一个闭包函数(相当于匿名函数,| 参数 | 语句块/表达式),是用来给框架返回应用实例的。
然后该句没有分号,是表达式,作为 main 的返回值。
我们接着看剩下的代码:
#[derive(Default)]struct QWQ {}
impl QWQ { fn new(cc: &eframe::CreationContext<'_>) -> Self { Self::default() }}其中,QWQ 是应用状态的结构体。
#[derive(Default)] 不是注释,形如 #[..] 的是 Rust 属性宏,可以给代码附加功能。这行可以自动实现一个 default 函数,会返回这个结构体的默认值,代码形如:
impl Default for QWQ { // 编译器自动帮你写的代码 fn default() -> Self { QWQ {} }}我们注意到有一个 impl ,这个是 implementation(实现)的缩写,开始给类型,结构体等添加方法函数的关键字。
接下来,实现 eframe 框架的核心,一定要实现 impl eframe::App for XXX 和函数 update 。
impl eframe::App for QWQ { fn update(&mut self, ctx: &egui::Context, frame: &mut eframe::Frame) { egui::CentralPanel::default().show(ctx, |ui| { ui.heading("Hello World!"); }); }}这里面, self 表示结构体,ctx 用来控制整个 UI,frame 是窗口本身,可以控制窗口关闭。
然后再在终端中输入 cargo run 就可以看到界面了。
2.
可以改 options 来改变窗口配置:
let mut options = eframe::NativeOptions::default();options.centered = true;然后我们写出如下代码,比较简单不解释了:
use eframe::egui;
fn main() -> Result<(), eframe::Error> { let mut options = eframe::NativeOptions::default(); options.centered = true; eframe::run_native("Tools", options, Box::new(|cc| Box::new(QWQ::new(cc))))
}
#[derive(Default)]struct QWQ { nums: i32 ,}
impl QWQ { fn new(cc: &eframe::CreationContext<'_>) -> Self { Self { nums : 0 } }}
impl eframe::App for QWQ { fn update(&mut self, ctx: &egui::Context, frame: &mut eframe::Frame) { egui::CentralPanel::default().show(ctx, |ui| { ui.heading("Hello World!"); ui.horizontal(|ui| { if ui.button("dark").clicked() { ctx.set_visuals(egui::Visuals::dark()); } if ui.button("light").clicked() { ctx.set_visuals(egui::Visuals::light()); } }); ui.label(self.nums.to_string()); }); self.nums += 1; }}我们运行可以发现,显示的数字只有在鼠标等状态改变时才增加,所以 update 函数就是在这个时候被调用的。
部分信息可能已经过时