Rust 学习笔记:关于 Vector 的练习题

发布于:2025-05-16 ⋅ 阅读:(23) ⋅ 点赞:(0)

Rust 学习笔记:关于 Vector 的练习题

参考视频:

  1. 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。


网站公告

今日签到

点亮在社区的每一天
去签到