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

2023-12-02

此代码有效并打印“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 to usize并用在nth()?


您能做的最谨慎的事情就是使用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
}

对于更广泛的数字转换类型u32usize,参考如何安全且惯用地在数字类型之间进行转换?.

也可以看看:

  • 为什么允许使用“as”从 u64 到 usize 进行类型转换,但不允许使用“From”?
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 u32 和 usize 之间进行惯用转换? 的相关文章

随机推荐

  • 使用 Log4j 的每个用户都有不同的日志

    我有一个 Web 应用程序 我想为每个用户使用不同的日志 这样我就可以获得用户在系统上执行的操作的 历史记录 这是我到目前为止所拥有的 import java io File import java io IOException impor
  • 将单词列表转换为数组[关闭]

    Closed 这个问题需要细节或清晰度 目前不接受答案 我试图查看是否有任何脚本可以将单词列表转换为数组 但我似乎找不到 有人知道我在哪里可以找到一个吗 Input Dog Cat Hamster 转换为 Dog Cat Hamster 不
  • cURL 错误 58:SSL:无法加载证书“...”及其私钥:Mac 上的 OSStatus -25299

    该代码在 Ubuntu vagrant box 上运行良好 但在本地 MacO 上它不会加载证书 说 cURL error 58 SSL Can t load the certificate and its private key OSSt
  • 如何像矩阵乘法一样将行向量添加到列向量

    我有一个 nx1 向量和一个 1xn 向量 我想以一种特殊的方式添加它们 例如以有效的方式 矢量化 矩阵乘法 Example A 1 2 3 B 4 5 6 A odd add B 1 4 1 5 1 6 2 4 2 5 2 6 3 4 3
  • 命名空间::变量的多重定义,甚至使用 ifndef

    我知道我在这里一定做错了什么 rank h ifndef RANK H define RANK H namespace mmi int chunk void rank int my rank endif rank cpp include r
  • 如何检测 Python 是否作为 64 位应用程序运行? [复制]

    这个问题在这里已经有答案了 我正在对 Windows 注册表进行一些工作 根据 Python 运行为 32 位还是 64 位 某些键值会有所不同 如何检测 Python 是作为 64 位应用程序运行还是作为 32 位应用程序运行 我对检测
  • 在悬停时添加边框时如何防止移动? (透明边框不是解决方案)[重复]

    这个问题在这里已经有答案了 我想在悬停时为 div 添加边框 但是添加边框时 div 稍微有点拉屎 这是一个众所周知的问题 常见的解决方案是添加透明边框 例如 但是 我的 div 中有一张包含一些文本的图像 我希望该图像占据 div 的全宽
  • 正则表达式西班牙语和阿拉伯语单词

    如何编写匹配所有有效的西班牙语和阿拉伯语单词的正则表达式 用我知道的英语来说 它是a zA z 在希伯来语中是 俄语 我使用 JavaScript 范围a zA Z因为英语单词的简单和天真令人难以接受 它省略了所有带有重音符号的字母以及在借
  • 过渡到 vim。存在缩进问题

    我正在从手术中恢复 因此 我正在过渡到 VIM 作为起点 我选择使用 vim sensible 插件作为我的配置的基础 此外 我还安装了 vim rails 和 vim ruby 插件 这些都是通过 Pathogen 加载的 无论出于何种原
  • 序列化 JFrame 并通过网络发送

    我想做的是通过套接字发送 JFrame 问题是在我发送表格并按下按钮查看它之后 我得到以下异常 package ds3 import java io IOException import java io ObjectInputStream
  • Android - 在 UI Fragment 中保留对象

    在我的项目中 我最初使用的是这个方案 活动A UI gt 片段B 非 UI gt 适配器 AsyncTask B保留与setRetainInstance true 并更新A UI A实例化B with getFragmentManager
  • 在 .NET 中按换行符拆分字符串

    我需要在 NET 中将字符串拆分为换行符 我知道拆分字符串的唯一方法是使用Split方法 然而 这不允许我 轻松地 在换行符上拆分 那么最好的方法是什么 要分割字符串 您需要使用采用字符串数组的重载 string lines theText
  • jQuery Mobile 站点中所有页面通用的弹出窗口

    我正在尝试使用 jQuery Mobile 制作一个网站 它由 HTML 文件中的许多页面组成 有些只有一页 有些有多个页面 使用它们的多页功能 该网站将有一些通知弹出窗口 它们在所有页面上看起来都一样 我正在使用他们的弹出窗口新的弹出功能
  • Python-按前两个单词对行进行分组

    我想按文件中的前两个单词对文件进行分组 然后重新排列和打印 我想做 lines file readlines i 0 for line in lines word1 line split 0 word2 line split 1 if wo
  • c - 嵌入式系统中Long Long到char的转换函数

    我正在使用嵌入式系统 我需要实现一种将 long long 转换为 char 的方法 问题是我不能在这个系统中使用 sprintf 来做到这一点 所以我正在寻找替代方法 函数来实现这一点 欢迎提出 LongLongToChar 函数的实现建
  • FindBugs 希望 readObject(...) 为私有序列化,为什么?

    我正在某些代码上运行 findbugs 它说 readObject 方法必须是私有的才能调用序列化 反序列化 为什么 如果公开的话会有什么问题呢 About readObject writeObject 作为私有的 情况如下 如果你的类 B
  • 图像比较 - 旋转、对齐和缩放

    我有以下需求 有一些表格 即空白表格 例如调查中使用的表格 那些没有填充信息的 从现在开始我将称之为图像模板 除了图像模板之外 我还有很多图像 这些图像本质上都是充满信息的图像模板 例如 有一项调查 有两个空白需要填写 这些是图像模板 许多
  • 在 Windows XP 中从数据包中检索标头目标地址的函数

    我有兴趣检索入站数据包发送到的目标地址 例如在 Linux 上你可以使用recvmsg res recvmsg socket msghdr 0 get cmsg CMSG FIRSTHDR msghdr struct in pktinfo
  • Win2D 在 C++/WinRT 中可用吗?

    我需要在我的 cppwinrt 项目中使用 win2D 使用 Win2D 示例文件作为模型 我尝试模仿其设置 放入该项目中的 win2d 包文件 复制自定义构建步骤 但我无法编译它 我记得有人谈论过 Win2D 很快就会添加到标准 cppw
  • 如何在 u32 和 usize 之间进行惯用转换?

    此代码有效并打印 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