流程控制
Rust是一个基于表达式的语言,大多数代码都有一个返回值。除了一些声明语法。 条件与循环也是表达式,所以它们可以有返回值。
let cond = true;
let a = if cond {
32
}else {
23
};
if else
let n = 5;
if n > 0 {
println!("{} is positive",n);
}else if n < 0 {
println!("{} is negative",n);
}else {
println!("{} is zero",n);
}
// 作为表达式
// 返回值各个分支的值必须相同
let b = if n < 0 {
2.0
}else {
3.0
};
println!("{}",b);
loop
fn main() {
// 1 + 2 + 3 ... 100
let mut sum = 0;
let mut index = 1;
// 可以将loop的值赋给一个变量
let result = loop {
sum += index;
index += 1;
if index > 100 {
break sum * 2
}
};
println!("sum = {}, index = {}, result : {}",sum,index,result);
}
for range
Rust中的for…in…语法可以用来遍历一个迭代器,有多种方式可以创建一个迭代器。
- a..b 将创建一个包含a而不包含b,步长为1的迭代器。
- a..=b 将创建一个包含a且包含b,步长为1的迭代器。
for i in 0..5 {
println!("{}",i);
}
println!("-----");
for i in 0..=5{
println!("{}",i);
}
for range 遍历数组
fn main() {
let array = ["a","b","c","d"];
for i in array.iter() {
println!("{:?}",i)
}
// 使用 iter_mut() 可以修改元素,前提是数组定义的时候需要是 mut
// for i in array.iter_mut() {
// println!("{:?}",i)
// }
}
模式匹配
模式匹配 类似于其他语言中的switch
let opcode:u8 = 42;
match opcode {
42 => {
println!("123");
}
// default
_ => {
println!("321");
}
}
if let语法糖
可用来简化模式匹配的代码。只关心满足条件的操作。
let opcode:u8 = 42;
if let 42 = opcode {
println!("123");
}
也可以匹配枚举,包括枚举内的参数
enum Symbol {
Char(char),
Num
}
fn main() {
let f = Symbol::Char('A');
if let Symbol::Char(x) = f {
println!("{}",x)
}
}
// output
// A
while let语法糖
while let定义当满足条件时,while会一直执行下去
// 加上此语句将Symbol声明为可打印类型,println才能打印
#[derive(Debug)]
enum Symbol {
A,
B
}
fn main() {
let mut letter = Symbol::A;
while let Symbol::A = letter {
println!("{:?}",letter);
letter = Symbol::B
}
}
函数
#[derive(Debug)]
struct Point {
x: u64,
y: u64,
}
// 方法
impl Point {
fn new(x:u64,y:u64)->Point{
Point{x,y}
}
fn get_x(&self) -> u64{
self.x
}
fn set_x(&mut self,x:u64){
self.x = x
}
}
fn main() {
let mut p = Point::new(10,20);
println!("{:?}",p);
println!("{:?}",p.x);
println!("{:?}",p.get_x());
p.set_x(30);
println!("{:?}",p.get_x());
//println!("{}",fibonacci(10))
}
// 函数
fn fibonacci(n: u64) ->u64 {
if n < 2 {
n
}else {
fibonacci(n - 1) + fibonacci(n-2)
}
}
move语法
use std::thread;
fn main() {
let hm = "hello world";
// move : 将环境中的值移到闭包内部
// 使用场景-多线程:从主线程移动到子线程
thread::spawn(move || {
// hm是主线程中的值
println!("{}",hm);
}).join();
}
高阶函数
满足以下条件即是一个高阶函数
- 接受一个或多个函数作为输入
- 输出一个函数
fn main() {
let a = 5;
let b = 4;
println!("{}",calc(add,a,b));
println!("{}",calc(sub,a,b));
// 使用函数作为返回值
println!("{}",calc2("add")(a,b));
println!("{}",calc2("sub")(a,b));
}
fn add(a:u32,b:u32)->u32{
a+b
}
fn sub(a:u32,b:u32)->u32{
a-b
}
type Method = fn(u32,u32)->u32;
fn calc(method: Method,a:u32,b:u32)->u32{
method(a,b)
}
fn calc2(method: &str)->Method{
match method {
"add" => add,
"sub" => sub,
_ => unimplemented!()
}
}
示例
extern crate rand;
// 引入随机数生成函数
use rand::Rng;
use std::io;
use std::io::Read;
fn main(){
let secret_number = rand::thread_rng().gen_range(1..101);
loop {
// 获取用户输入
println!("input :");
let mut guess = String::new();
// 读取用户输入
io::stdin().read_line(&mut guess).unwrap();
let guess_number: u32 = match guess.trim().parse() {
Ok(num) => num,
Err(_err) => continue
};
println!("You guessed: {}",guess_number);
// 判断大小
if guess_number > secret_number {
println!("too big");
}else if guess_number < secret_number {
println!("too small");
}else {
println!("You are 666");
break;
}
}
}