Rust 学习笔记:关于 Vector 的练习题
Rust 学习笔记:关于 Vector 的练习题
参考视频:
- https://www.bilibili.com/video/BV16PzAYLErb
哪个调用会报错?
fn find_until(v: &Vec<i32>, n: i32, til: usize) -> Option<usize> {
for i in 0..til {
if v[i] == n {
return Some(i);
}
}
return None;
}
A. find_until(&vec![1, 2, 3], 0, 0)
B. find_until(&vec![1, 2, 3], 1, 4)
C. find_until(&vec![1, 2, 3], 3, 3)
D. find_until(&vec![1, 2, 3], 4, 4)
答:D。
以下代码能否通过编译?若能,输出是?
fn main() {
let mut v = Vec::new();
let s = String::from("hello ");
v.push(s);
v[0].push_str("world");
println!("original: {}", s);
println!("new: {}", v[0]);
}
不能通过编译。s 已经被移动到 v[0] 了,再打印丢失所有权的 s 会报错。
以下代码能否通过编译?若能,输出是?
fn main() {
let v = vec![String::from("hello ")];
let mut s = v[0];
s.push_str("world");
println!("{s}");
}
不能通过编译。String 没有 Copy trait,不能移动。
以下代码能否通过编译?若能,输出是?
fn main() {
let mut v = vec![1, 2, 3];
for i in &mut v {
v.push(*i);
}
println!("{} {} {}", v[3], v[4], v[5]);
}
不能通过编译。即使 v 是可变借用的,也只允许 i 在 for 循环中被改变,而不是 v。因此调用 v.push 是一个所有权错误。
以下代码能否通过编译?若能,输出是?
fn main() {
let mut v: Vec<i32> = vec![1, 2, 3];
let mut v2: Vec<&mut i32> = Vec::new();
for i in &mut v {
v2.push(i);
}
*v2[0] = 5;
let a = *v2[0];
let b = v[0];
println!("{a} {b}");
}
可以通过编译。输出:5 5。