【发布时间】:2017-12-18 11:26:40
【问题描述】:
我需要实现一个for 循环,从一个浮点数到另一个浮点数,步骤为另一个浮点数。
我知道如何用类 C 语言实现它:
for (float i = -1.0; i < 1.0; i += 0.01) { /* ... */ }
我还知道,在 Rust 中,我可以使用 step_by 指定循环步骤,如果我将边界值和步骤设为整数,这将给我我想要的:
#![feature(iterator_step_by)]
fn main() {
for i in (0..30).step_by(3) {
println!("Index {}", i);
}
}
当我使用浮点数执行此操作时,会导致编译错误:
#![feature(iterator_step_by)]
fn main() {
for i in (-1.0..1.0).step_by(0.01) {
println!("Index {}", i);
}
}
这是编译输出:
error[E0599]: no method named `step_by` found for type `std::ops::Range<{float}>` in the current scope
--> src/main.rs:4:26
|
4 | for i in (-1.0..1.0).step_by(0.01) {
| ^^^^^^^
|
= note: the method `step_by` exists but the following trait bounds were not satisfied:
`std::ops::Range<{float}> : std::iter::Iterator`
`&mut std::ops::Range<{float}> : std::iter::Iterator`
如何在 Rust 中实现这个循环?
【问题讨论】:
-
即使在 C 语言中,该循环也不是一个好主意,因为浮点不准确意味着您不确定它何时会停止(在您的示例中可能需要 200 或 201 步)。
-
@interjay 那么有什么替代方案呢?迭代整数然后从中计算所需的浮点数会更好吗?
-
我就是这样做的。
-
当然,您也可以将此类逻辑包装在您自己的迭代器中。