"首次提交"
This commit is contained in:
1
loop_while_for/.gitignore
vendored
Executable file
1
loop_while_for/.gitignore
vendored
Executable file
@ -0,0 +1 @@
|
||||
/target
|
8
loop_while_for/Cargo.toml
Executable file
8
loop_while_for/Cargo.toml
Executable file
@ -0,0 +1,8 @@
|
||||
[package]
|
||||
name = "loop_while_for"
|
||||
version = "0.1.0"
|
||||
edition = "2021"
|
||||
|
||||
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
||||
|
||||
[dependencies]
|
114
loop_while_for/src/main.rs
Executable file
114
loop_while_for/src/main.rs
Executable file
@ -0,0 +1,114 @@
|
||||
fn main() {
|
||||
println!("Hello, world!");
|
||||
loop_fun();
|
||||
while_fun();
|
||||
for_fun();
|
||||
}
|
||||
/* rust 提供了三种循环方式
|
||||
loop、while、和for
|
||||
*/
|
||||
fn loop_fun(){
|
||||
//loop 循环,一直循环直到主动退出
|
||||
//loop 从功能上和while true 是一样的,
|
||||
//但是为什么说要单独列出来我目前还不是很清楚
|
||||
|
||||
let mut num = 100;
|
||||
loop {
|
||||
// num --;// 不允许这样写
|
||||
num -= 1;
|
||||
if num > 10{
|
||||
//提前结束本次循环
|
||||
continue;
|
||||
}
|
||||
if num < 0 {
|
||||
// 主动结束循环
|
||||
break;
|
||||
}
|
||||
println!("{}", num)
|
||||
} // 这里是不需要加上分号的,因为他不是一个语句
|
||||
println!("go,go,go");
|
||||
|
||||
// loop也是表达式,所以其可以产生值作为右值
|
||||
let mut num = 100;
|
||||
let cond = 3%num;
|
||||
let ret = loop {
|
||||
num -=1;
|
||||
if cond == num{
|
||||
//break;//这样主动退出之后ret的值将会是一个()
|
||||
//break //这样也是可以的和上面效果一致
|
||||
|
||||
break num; //case1 这样会把num作为整个loop表达式的值给到ret, ret类型就是i32
|
||||
//break num //case2 不加上分号也是可以的
|
||||
/* case3 可以换行写,但是要加分号了,不然跨了行不会被认为是一个完整的语句,
|
||||
但是还是不要写这变态的代码吧😅
|
||||
break
|
||||
num;
|
||||
*/
|
||||
|
||||
break 123;//break语句后的代码不会被执行到。
|
||||
}
|
||||
};
|
||||
println!("ret is {}", ret)
|
||||
}
|
||||
|
||||
fn while_fun(){
|
||||
// while 循环,
|
||||
// 检查条件如果符合就进入循环并直到主动退出或者条件不满足
|
||||
// 每轮循环都会检查条件
|
||||
|
||||
let mut num = 30;
|
||||
// 循环条件的检查,满足才会开始&继续循环
|
||||
while num > 0 {
|
||||
if num > 10{
|
||||
println!("{} is > 10, I cant process -_-!", num);
|
||||
break; //提前终止循环
|
||||
}
|
||||
if num % 2 == 0 {
|
||||
println!("{}!", num);
|
||||
num -= 1;
|
||||
continue;// 提前终止本轮循环
|
||||
}
|
||||
println!("{}", num);
|
||||
num -= 1;//修改循环条件
|
||||
} // 这里同样不用加分号,因为while 是表达式不是语句
|
||||
if num == 0{
|
||||
println!("go,go,go");
|
||||
}
|
||||
|
||||
let mut num = 30;
|
||||
// while 表达式可作为右值,但是在里面不能用break返回其值
|
||||
// 因为while有可能是条件不满足而结束,此时是没有值的,如果break指定了返回值,这样就会导致
|
||||
// 编译器无法在编译期间确定ret的类型!
|
||||
// 这也引发了我对loop的思考,是否就是while这种特性,导致需要一种完全交给开发者可控的退出方式的循环才催生了loop,👻
|
||||
// 因为loop 的退出是完全开发者编写的退出时机,也就使得可以带有返回值
|
||||
let ret = while num > 0 {
|
||||
num = 0;
|
||||
//break num;//不可以像loop那样带有值
|
||||
break;
|
||||
}; // 这里必须加分号,因为while 表达式作为右值和let ret一起构成完整语句
|
||||
}
|
||||
|
||||
fn for_fun(){
|
||||
//for 循环 语法就是 for xxx in yyy {}
|
||||
// yyy是一个可迭代的对象,比如数组,range等
|
||||
// for 循环相比较while,loop可以安全的遍历迭代对象而不用担心越界的问题。
|
||||
|
||||
let ary = [0, 1, 2, 3, 4, 5];
|
||||
|
||||
//遍历整个数组并打印
|
||||
for item in ary.iter() {
|
||||
println!("{}", item);
|
||||
}
|
||||
|
||||
//从100到-1遍历一遍 range: start..end
|
||||
let rng = 100..1;
|
||||
for item in 100..-1 {
|
||||
if item > 10 {
|
||||
continue;
|
||||
}
|
||||
if item <=0 {
|
||||
break;// 和while 一样可以提前退出但是无法携带值
|
||||
}
|
||||
println!("{}", item);
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user