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

问题描述 投票:9回答:2

此代码工作并打印“b”:

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

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

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

由于某些外部原因,我必须使用u32类型的变量n。我如何将u32转换为usize并在nth()中使用它?

types rust type-conversion
2个回答
11
投票

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

let ch = s.chars().nth(n as usize).unwrap();

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

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

let n = 1u32;

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

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


2
投票

你可以做的最谨慎的事情是当值不能适合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);
}

通过盲目地使用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
}
© www.soinside.com 2019 - 2024. All rights reserved.