如何在u32和usize之间进行惯用转换?

Saj*_*uuk 14 types type-conversion rust

例如,此代码工作并打印"b":

fn main() {
    let s = "abc";
    let ch = s.chars().nth(1).unwrap();
    println!("{}", ch);
}
Run Code Online (Sandbox Code Playgroud)

另一方面,此代码导致不匹配类型错误.

fn main() {
    let s = "abc";
    let n: u32 = 1;
    let ch = s.chars().nth(n).unwrap();
    println!("{}", ch);
}
Run Code Online (Sandbox Code Playgroud)
error[E0308]: mismatched types
 --> src/main.rs:5:28
  |
5 |     let ch = s.chars().nth(n).unwrap();
  |                            ^ expected usize, found u32
Run Code Online (Sandbox Code Playgroud)

出于某种原因,我必须使用u32变量类型n.我怎么能转换u32usize并在使用它nth()

Tat*_*shi 19

as运算符适用于所有数字类型:

let ch = s.chars().nth(n as usize).unwrap();
Run Code Online (Sandbox Code Playgroud)

Rust强制您转换整数以确保您了解签名或溢出.

整数常量可以有一个类型后缀:

let n = 1u32;
Run Code Online (Sandbox Code Playgroud)

但是,请注意负常数,例如-1i32内部- 1i32.

声明没有显式类型规范的整数变量显示为{integer},并将从其中一个方法调用中正确推断.

  • 为了保护盲目复制和粘贴此答案的人:我认为@Shepmaster(/sf/answers/3903836891/)的答案应该是“接受”的答案。有人可能会在这里偶然发现这个答案,认为使用“as”可以节省数字转换,但事实并非如此。 (10认同)

She*_*ter 6

您可以做的最谨慎的事情是,TryFrom如果该值不能满足以下条件,请使用并惊慌usize

use std::convert::TryFrom;

fn main() {
    let s = "abc";
    let n: u32 = 1;
    let n_us = usize::try_from(n).unwrap();
    let ch = s.chars().nth(n_us).unwrap();
    println!("{}", ch);
}
Run Code Online (Sandbox Code Playgroud)

如果盲目使用as,则在usize小于32位的平台上运行时,您的代码将以神秘的方式失败。例如,某些微控制器使用16位整数作为本机大小:

fn main() {
    let n: u32 = 0x1_FF_FF;
    // Pretend that `usize` is 16-bit
    let n_us: u16 = n as u16;

    println!("{}, {}", n, n_us); // 131071, 65535
}
Run Code Online (Sandbox Code Playgroud)