gpt4 book ai didi

string - 范围内的算术运算顺序问题

转载 作者:行者123 更新时间:2023-11-29 08:29:17 26 4
gpt4 key购买 nike

我正在尝试使用 Rust 书籍和 Exercism.io 网站学习 Rust。我对 this specific exercise 有疑问.代码如下:

pub fn series(_digits: &str, _len: usize) -> Vec<String> {
(0.._digits.len() + 1 - _len)
.map(|i| _digits[i..i + _len].to_string())
.collect()
}

例如,series("12345", 3)应该返回一个包含["123", "234", "345"]<的Vec/.

代替 (0.._digits.len() + 1 - _len),我尝试使用 (0.._digits.len() - _len + 1) 相反,但在这种情况下,单元测试“test_too_long”失败了:

#[test]
#[ignore]
fn test_too_long() {
let expected: Vec<String> = vec![];
assert_eq!(series("92017", 6), expected);
}

我很惊讶,因为它看起来和我一样。为什么会失败?

最佳答案

发生这种情况是因为在 Debug模式下,会溢出而不是 panic 的算术运算,而 panic 会导致测试失败。

使用重新排列的版本 ( playground ),在 series("12345", 6) 中,digits.len() - len + 1 变为 5 使用大小 - 6 使用大小 + 1 使用大小。该程序甚至没有到达 + 1,因为只有 5usize - 6usize 发生困惑。 (usize 不能表示负数,所以从 5 中减去 6 会导致溢出。)

错误消息包含对失败性质的强烈暗示:

---- test_too_long stdout ----
thread 'test_too_long' panicked at 'attempt to subtract with overflow', src/lib.rs:2:9
note: Run with `RUST_BACKTRACE=1` for a backtrace.

digits.len() + 1 - len 有效,但是,因为 6 恰好 比字符串的长度多 1,因此 5 + 1 - 6 可以计算为零而不会溢出。但是,如果您将 test_too_long 更改为调用 series("12345", 7),那么两个版本都会出现错误。这似乎是编写测试套件的人的疏忽,特别是考虑到指令没有指定预期的行为:

And if you ask for a 6-digit series from a 5-digit string, you deserve whatever you get.

对于它的值(value),这里有一种方法可以让 series 为任何大于输入长度的 len 返回一个空向量:(digits.len () + 1).saturating_sub(len) 类似于 digits.len() + 1 - len,但是如果减法的结果小于 0,它只返回 0

关于string - 范围内的算术运算顺序问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53999655/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com