我正在努力寻找一种方法,从一个向量的末端取两个值,求和这些值,然后把和推到向量上.

我发现poptruncatedrain不起作用,因为它们从原始向量中移除了值.

fn main() {
    println!("Which Fibonacci number would you like to find?");

    let mut fib_num = String::new();

    io::stdin().read_line(&mut fib_num)
        .expect("Failed to read line");

    let fib_num: u32 = fib_num.trim().parse()
        .expect("Please enter a number");

    let mut stored_nums: Vec<u32> = vec![0, 1];

    while fib_num > stored_nums.len() as u32 {
        let mut limit = stored_nums.len();
        let mut new_num1 = stored_nums.pop().unwrap();
        let mut new_num2 = stored_nums.pop().unwrap_or(0);
        stored_nums.push(new_num1 + new_num2);
    }
}

推荐答案

你需要考虑向量doesn't have two items的情况.

我会使用迭代器适配器,比如Iterator::revIterator::take,最后使用Iterator::sum:

let sum = stored_nums.iter().rev().take(2).sum();
stored_nums.push(sum);

这允许您避免explicit次处理向量/切片/迭代器太短但代码仍隐式处理它的情况.


您还可以直接索引到切片中:

let len = stored_nums.len();
let sum = stored_nums[len - 1] + stored_nums[len - 2];
stored_nums.push(sum);

然而,如果少于2个元素,这将导致panic .

在这种情况下,您可以try 处理向量太短的问题,但它有点冗长:

fn add_last_two(nums: &[u32]) -> Option<u32> {
    let len = nums.len();

    let idx_a = len.checked_sub(1)?;
    let idx_b = len.checked_sub(2)?;

    let a = nums.get(idx_a)?;
    let b = nums.get(idx_b)?;

    Some(a + b)
}

fn main() {
    let mut stored_nums: Vec<u32> = vec![0, 1];
    let sum = add_last_two(&stored_nums).unwrap_or(0);
    stored_nums.push(sum);
}

请注意,在Vec中使用a Fibonacci iteratorcollect可能更好.

Rust相关问答推荐

给定使用newype习语定义的类型上的铁 rust Vec,有没有方法获得底层原始类型的一部分?

如何在tauri—leptos应用程序中监听后端值的变化?""

Rust TcpStream不能在读取后写入,但可以在不读取的情况下写入.为什么?

在使用#[NO_STD]时,如何在Rust中收到紧急消息?

字段类型为Boxed的 struct 的生存期必须超过static

零拷贝按步骤引用一段字节

为什么 Rust 需要可变引用的显式生命周期而不是常规引用?

.to_owned()、.clone() 和取消引用 (*) 之间有区别吗?

如何使用 Rust Governor 为每 10 秒 10 个请求创建一个 RateLimiter?

如何从 x86_64 Mac 构建 M1 Mac?

在运行时在 Rust 中加载字体

切片不能被 `usize` 索引?

在异步 Rust 中,Future 如何确保它只调用最近的 Waker?

产生拥有值的迭代器的 Rust 可变borrow 在循环中失败

为什么在 macOS / iOS 上切换 WiFi 网络时 reqwest 响应会挂起?

如何解析 Rust 中的 yaml 条件字段?

你能告诉我如何在 Rust 中使用定时器吗?

如何用另一个变量向量置换 rust simd 向量?

如何从 Rust 中不同类型的多个部分加入 Path?

为什么这个 Trait 无效?以及改用什么签名?