Rust学习语法篇(一)
Contents
循环
带标签的循环:
fn main() {
let mut count = 0;
'counting_up: loop {
println!("count = {}", count);
let mut remaining = 10;
loop {
println!("remaining = {}", remaining);
if remaining == 9 {
break;
}
if count == 2 {
break 'counting_up;
}
remaining -= 1;
}
count += 1;
}
println!("End count = {}", count);
}
loop的一个用例是重试可能会失败的操作,比如检查线程是否完成了任务。因此,需要将操作的结果从返回中传递给其他代码。为此,可以在用于停止循环的break
表达式添加想要返回的值。
fn main() {
let mut counter = 0;
let result = loop {
counter += 1;
if counter == 10 {
break counter * 2;
}
};
println!("The result is {}", result);
}
while循环:
fn main() {
let mut number = 3;
while number != 0 {
println!("{}!", number);
number -= 1;
}
println!("LIFTOFF!!!");
}
for循环:
fn main() {
let a = [10, 20, 30, 40, 50];
for element in a {
println!("the value is: {}", element);
}
// 反转区间
for number in (1..4).rev() {
println!("{}!", number);
}
}
所有权
Rust永远不会创建数据的”深拷贝“。 默认情况下,引用是不可变的,我们无法通过引用修改内容。加上mut后的可变引用可以修改内容。 在同一时间,只能有一个对某一特定数据的可变引用,尝试创建2个可变引用的代码会失败。这样的限制在编译的时候就避免了数据竞争。
发生数据竞争的条件:
- 两个或更多指针同时访问同一数据。
- 至少有一个指针呗用来写数据。
- 没有同步数据访问的机制。
同样,也不能在拥有对一个数据的引用的时候,再加一个可变引用。
总结:
- 在任意给定的时间,要么只能有一个可变引用,要么只能有多个不可变引用。
- 引用必须总是有效的。
数组和切片
数组不可改变长度,vector可以改变长度.
fn main() {
// 数组
let a: [i32; 5] = [1, 2, 3, 4, 5];
// 以下两种写法等同。
let a = [3; 5];
let a = [3, 3, 3, 3, 3];
// 访问数组元素
let first = a[0];
let second = a[1];
}
切片相当于数组的部分引用.
fn main() {
let s = String::from("hello world");
let hello = &s[0..5];
let world = &s[6..11];
}