gpt4 book ai didi

for-loop - 为什么以负数开始的范围不迭代?

转载 作者:行者123 更新时间:2023-11-29 07:52:57 24 4
gpt4 key购买 nike

我刚刚开始学习 Rust。在我使用这种语言的第一步中,当在 main 或另一个函数中执行迭代时,我发现了一个奇怪的行为,如下例所示:

fn myfunc(x: &Vec<f64>) {
let n = x.len();
println!(" n: {:?}", n);
for i in -1 .. n {
println!(" i: {}", i);
}
}

fn main() {
for j in -1 .. 6 {
println!("j: {}", j);
}

let field = vec![1.; 6];
myfunc(&field);
}

虽然正确显示了 main 中的循环,但没有为 myfunc 中的循环打印任何内容,我得到以下输出:

j: -1
j: 0
j: 1
j: 2
j: 3
j: 4
j: 5
n: 6

这种行为的原因是什么?

最佳答案

类型推断导致您范围内的两个数字都是 usize , 不能表示负数。因此,范围从 usize::MAX 开始。至 n , 它从来没有任何成员。

为了弄清楚这一点,我使用了一个技巧来打印出事物的类型:

let () = -1 .. x.len();

哪个有这个错误:

error: mismatched types:
expected `core::ops::Range<usize>`,
found `()`
(expected struct `core::ops::Range`,
found ()) [E0308]
let () = -1 .. x.len();
^~

深入细节, slice::len 返回 usize .你的-1是一个无类型的整数值,它将符合它需要的任何上下文(如果没有任何内容需要符合,它将回退到 i32 )。

在这种情况下,就好像您实际键入了 (-1 as usize)..x.len() .

好消息是您可能不想从 -1 开始反正。切片是零索引的:

fn myfunc(x: &[f64]) {
let n = x.len();
println!(" n: {:?}", n);
for i in 0..n {
println!(" i: {}", i);
}
}

额外的好消息是这个烦恼是fixed in the newest versions of Rust .它将导致警告,然后最终导致错误:

warning: unary negation of unsigned integers will be feature gated in the future
for i in -1 .. n {
^~

另请注意,您永远不应接受 &Vec<T>作为参数。始终使用 &[T]因为它更灵活,您不会有任何损失。

关于for-loop - 为什么以负数开始的范围不迭代?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32414704/

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