Rust 中的 Result & Option
通过这篇文章来给 Rust 中的 Result 和 Option 这两个工具做个笔记,以加深对这两个重要工具的记忆和理解。
ResultResult 是一个用于处理错误的枚举类型,我们可以看看Rust中是怎么定义的:
1234enum Result<T, E> { Ok(T), Err(E),}
Result 有两个成员 Ok(T) 和 Err(E) 这里用到了泛型参数,在正常的情况下我们都是使用的Ok(T),程序中会把可能遇到出错的地方用Err(E)来进行处理。
这里我写了一个简单的例子:hello函数有一个i32 类型的参数,通过判断n 是否大于 10 来决定函数返回的类型,正确时返回 Ok(T) ,不正确返回 Err(E)。这里Result 的Err类型是 &‘static str类型,不能省略 'static。
1234567891011121314fn main() { match hello(11) { Err(e) => println!("{ ...
Rust Sized Trait 的使用
我们来看下 Rust 中”Sized“的使用,这是一个 Trait,路径在:std::marker。
1234567891011121314151617#[derive(Debug)]struct Bar<T: ?Sized>(T);fn main() { let a = Bar(123); let b = Bar(["Hello", "World"]); let c = Bar([12.1, 22.5, 65.4]); println!("a: {}", a.0); for i in b.0.iter() { println!("{}", i); } for i in c.0.iter() { println!("{}", i); }}
生成 Github SSH 秘钥
生成 SSH KEY。命令:
1ssh-keygen -t rsa -C ‘user.email’
命令参数解释:
-t 指定秘钥类型,默认是 rsa,可以省略。
-C 设置注释文字,比如邮箱
-f 指定秘钥文件存储的文件名
生成结果:
12zxx@local:~$ ls ~/.ssh/id_rsa id_rsa.pub
把 id_rsa.pub 中的内容复制到 github 即可。
Rust 闭包与迭代器
Rust 的 闭包(closures)是可以保存进变量或作为参数传递给其他函数的匿名函数。可以在一个地方创建闭包,然后在不同的上下文中执行闭包运算。不同于函数,闭包允许捕获调用者作用域中的值。我们将展示闭包的这些功能如何复用代码和自定义行为。
定义一个闭包12345let expensive_closure = |num| { println!("calculating slowly..."); thread::sleep(Duration::from_secs(2)); num };
官方例子:123456789101112131415161718192021222324252627282930313233use std::thread;use std::time::Duration;fn main() { generate_workout(25, 43);}// fn simulated_expensive_calculation(intensity: u32) ...
NE555 时基芯片电路收集
NE555 内部框图
引脚
描述
1脚
电源负极|GND
2脚
低触发端,该端电压低于 1/3 VCC时,输出高电平
3脚
输出端
4脚
强制复位端,低电平时,芯片不工作,输出低电平。不用时接高电平。
5脚
控制端,外接电压时改变两个比较器的基准电压,该脚不用时接一个0.01uF的电容到地。
6脚
高触发端,该端电压高于 2/3 VCC时,输出高电平
7脚
放电端
8脚
VCC
Rust 生命周期
生命周期是Rust中相当重要的概念,必须彻底掌握。
要学习生命周期的概念是为了避免悬垂引用,学过C语言的都知道指针,当一个指针指向一个不确定的地址时很可能会领程序出错。
一段错误的代码:
123456789fn main() { /// 生命周期例子 let r; { let x = 5; r = &x; } // x 结束生命 println!("r: {}", r); // r 引用了无效的地址}
Rust Trait 学习笔记
今天就来学习记录下Rust中的必掌握知识之 Trait。
Trait 是Rust 中的接口,可以为不同的类型提供同一类行为(函数)。
定义一个 Trait12345678pub trait Summary { fn summarize_author(&self) -> String; // 带有默认实现的函数 fn summarize(&self) -> String { format!("(Read more from {})", self.summarize_author()) }}
上面代码定义了一个名字为 Summary的 Trait ,并且里面分别声明了一个名为 summarize_author() 的函数和一个函数定义 summarize()。
定义两个结构体并且实现 Summary Trait12345678910111213141516171819202122232425262728// NewsArticle 结构体pub s ...
Rust 猜字游戏代码
Rust 官网猜字游戏例子:
1234567891011121314151617181920212223242526272829303132333435363738// Rust 猜字游戏use rand::Rng;use std::cmp::Ordering;use std::io::{self, Write};fn main() { println!("=== 猜字游戏开始 ==="); let secret_number = rand::thread_rng().gen_range(1..101); // Loop 循环 loop { print!("请输入一个0~100之间的整数: "); io::stdout().flush().unwrap(); let mut guess = String::new(); /* 创建一个可变字符串变量 */ io::stdin() .read_line(&a ...
Rust 相关命令
该篇文章记录了 Rust 相关的命令,以便不时之需。
1. rustc –version查看 rust 的版本号
1$ rustc --version
2. rustup update更新 rust 版本
1$ rustup update
3. rustup doc打开本地文档
1$ rustup doc
4. 创建 Rust 项目rust 项目的创建使用 cargo 工具生成管理的。
cargo new hello_rust 创建项目(可执行)
cargo build 编译项目
cargo check 检查项目
cargo run 运行项目
cargo build –release 以 Release 模式编译
cargo run –release 以 Release 模式运行
5. 查看命令帮助cargo new –help,可以查看该命令相关的帮助。
123456789101112131415161718192021222324252627282930313233$ cargo new --helpcargo.exe-new Create a new cargo p ...
C语言编程技巧
assert() 的使用首先要先包含 assert 头文件 #include <assert.h>
例子:
12345678#include <stdio.h>#include <assert.h>int main(void){ assert(5>5); // 该表达式错误,运行程序将会在终端打印出错误信息 return 0;}
输出:
123zsf90@DESKTOP-N95R1I7:$ ./a.out a.out: main.c:39: main: Assertion `5 > 5' failed.Aborted
能使用宏定义就用宏,参考Linux在 c 语言中能用宏定义的就尽量使用宏定义,可以看到 Linux中头文件中存在大量的宏定义。