Rust 如何迭代所有字节值(溢出'0..256'中的\u文字)
我试图迭代所有可能的字节(Rust 如何迭代所有字节值(溢出'0..256'中的\u文字),rust,Rust,我试图迭代所有可能的字节(u8)值。不幸的是,0..256中的我的范围文本被强制转换为u8和256溢出: fn foo(byte: u8) { println!("{}", byte); } fn main() { for byte in 0..256 { foo(byte); println!("Never executed."); } for byte in 0..1 { foo(byte);
u8
)值。不幸的是,0..256
中的我的范围文本被强制转换为u8
和256
溢出:
fn foo(byte: u8) {
println!("{}", byte);
}
fn main() {
for byte in 0..256 {
foo(byte);
println!("Never executed.");
}
for byte in 0..1 {
foo(byte);
println!("Executed once.");
}
}
以上内容包括:
警告:u8的文字超出范围
-->src/main.rs:6:20
|
6 |表示0..256中的字节{
| ^^^
|
=注意:#[警告(溢出的_文本)]默认打开
第一个循环体根本不会执行
我的工作环境非常难看,而且由于演员阵容的原因,感觉很脆弱:
for short in 0..256 {
let _explicit_type: u16 = short;
foo(short as u8);
}
有更好的办法吗?这是个问题
其要点是,字节
被推断为u8
,因此0..256
被表示为范围
,但不幸的是256
溢出为u8
当前的解决方法是使用更大的整数类型并稍后转换为u8
,因为实际上从未达到256
有一个已进入最后评论期的;将来可能会有
用于0…255中的字节或其替代(0…255)。inclusive()
从Rust 1.26开始,inclusive范围使用语法。=
,因此您可以这样写:
for byte in 0..=255 {
foo(byte);
}
对于初学者来说,你可以在0..256
中丢失explicitType
并为i编写,只要你在foo(i作为u8)
中进行转换。然后i
将是i32
类型。不过这只是稍微好一点。@delnan:你的提示让我想到了(0..256).map(| byte | byte作为u8)
,它同样不直观,但至少向读者指出了它的神奇之处。但它仍然不好:(现在有一个开放的实现此功能。谢谢!奇怪的是,这样一个常见的情况需要一个相对新的符号。语法最终引发了最长的争论,它花了一段时间来解决。=
,而不是。
或其他东西。