安全 Rust 中的转换会导致运行时错误吗?

2024-03-09

我正在摆弄一点Any和铸造只是为了更深入地了解 Rust。从 C# 开始,我已经习惯了强制转换可能导致运行时异常,因为在 C# 中强制转换基本上意味着亲爱的编译器,相信我,我知道我在做什么,请将其转换为int32因为我知道它会起作用。

但是,如果您执行无效的转换,程序将在运行时因异常而崩溃。所以我想知道强制转换(安全)Rust 是否同样会导致运行时异常。

所以,我想出了这段代码来尝试一下。

use std::any::Any;

fn main() {
    let some_int = 4;
    let some_str = "foo";
    {
      let mut v = Vec::<&Any>::new();
      v.push(&some_int);
      v.push(&some_str);

      // this gives a None
      let x = v[0].downcast_ref::<String>();
      println!("foo {:?}", x);

      //this gives Some(4)
      let y = v[0].downcast_ref::<i32>();
      println!("foo {:?}", y);

      //the compiler doesn't let me do this cast (which would lead to a runtime error)
      //let z = v[1] as i32;

    }
}

到目前为止,我的观察是编译器似乎阻止了我这种运行时异常,因为我必须通过强制转换downcast_ref它返回一个Option这使它再次安全。我当然可以unwrap on a None炸毁它,但这不是我的意思;)

编译器阻止我写let z = v[1] as i32;这可能会导致运行时错误。那么,假设安全 Rust 中的转换永远不会导致运行时错误是否正确?

我知道防止运行时错误正是 Rust 的全部内容,所以它非常有意义,我只是想验证我的观察:)


铸造用asRust 中的功能非常有限。它只允许在原始数字和字符类型之间、指针和引用之间进行转换,以及从具体类型的值创建特征对象,仅此而已 -as例如,不可过载。因此,铸造用as总是不会出现恐慌,尽管如果您正在转换无法在目标类型中表示的值,您可能会观察到数字溢出,这可能是理想的,也可能不是理想的。

Rust 中不存在 C# 或 Java 中的强制转换运算符之类的东西。最接近它的是std::mem::transmute()这很像reinterpret_cast来自 C++。这是unsafe然而,即使它也有其局限性——它只能转换具有相同大小的类型的值。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

安全 Rust 中的转换会导致运行时错误吗? 的相关文章

随机推荐

  • 在 PL/SQL 中创建或模拟二维数组

    您能帮助我如何在 PL SQL 中为存储过程创建二维数组吗 这些列是动态的 因此它的类型也可以增长和变化 任何帮助表示赞赏 先感谢您 我有以下代码 Type CAR TABLE ARRAY is varray 2 of varchar2 2
  • 更改 UITabBarItem 图像

    我已经使用 Storyboard 来设置我的UITabBarController及其对应的ViewControllers 每当取消选择选项卡时 它都是灰色的 选择它时 它会呈现绿色 我想要其中之一UITabBarItems始终看起来相同 即
  • Font-Face 使用绝对路径

    是否可以使用绝对路径 fontace 我有以下目录结构 HP font Monoton woff Monoton eot css font css fontface css html index html 定义字体 font face fo
  • 在 C++11 中使用零或 NULL 哪个更好?

    如今 有了C 11 推荐使用什么 Zero or NULL 第一个还是第二个如果 int p getPointer if 0 p something if NULL p something UPDATE 我忘记新的了 if nullptr
  • Entity Framework Core - 版本 5+ 与输出数据库无关

    我有一个使用 EF Core 的应用程序 最初是使用 V3 1 1 编写的 我们决定冒险更新到 v5 0 1 现在它已经不再预览了 该应用程序支持 MSSQL 和 SQLite 最初运行得很好 迁移的创建基本上与工具和文档无关here ht
  • 您的启动项目“项目”未引用 Microsoft.EntityFrameworkCore.Design

    我正在使用 EntityFrameworkCore 版本 2 2 2 构建 WPF 应用程序 然而 当我想要Add Migration它向我输出一个错误 Your startup project project doesn t refere
  • 如何配置星号即时消息

    星号支持即时消息吗 我尝试为 IM 配置星号 从这个例子 https groups google com forum msg csipsimple users stBJYGQ88fw OgLW8CLVvIkJ 但是当我尝试将 IM 发送到另
  • 下限 > 0 的 .Net 数组

    虽然这可能是一件奇怪的事情 但我需要在 Net 中创建一个下限 gt 0 的数组 乍一看 这似乎是可能的 使用 Array CreateInstance typeof Object new int 2 new int 9 产生所需的结果 下
  • 一个maven项目如何依赖另一个本地maven项目?

    我有两个 Maven 项目project foo pom xml and project bar pom xml 我有foo取决于bar and I want that every timefoo pom xmlcompiles it ll
  • 单元测试模拟 GCS

    我很难找到一种方法来进行单元测试read and write此类中存在的方法 我正在尝试使用模拟补丁库创建一个模拟 以避免调用 Google Storage 但我很难弄清楚如何做到这一点 from google cloud import s
  • 在c#中用0-9之间的随机数填充数组[重复]

    这个问题在这里已经有答案了 可能的重复 在 C 中用 0 9 之间的唯一随机数填充数组 https stackoverflow com questions 10688044 filling a array with uniqe random
  • 使用相关字段更新项目的示例过滤器挂钩

    我有 3 个集合 客户 经销商 和 订单 客户与经销商之间存在多对一的关系 经销商与客户之间是一对多的关系 订单与客户之间存在多对一的关系 我想使用先前配置的多对一关系根据所选客户自动设置orders reseller 字段 payload
  • img 元素上的 HTML 宽度/高度属性和 CSS 宽度/高度属性有什么区别?

    超文本标记语言 img 元素可以有width height属性 也可以有CSSwidth height特性 img src xxx img width 16 height 16 style width 16px height 16px HT
  • 我无法从数据库中检索图像

    我有一个包含电影名称 描述和封面图片的数据库 封面图片字段类型为 blob 问题是我无法从数据库中检索它 我想在他们旁边的封面图片上显示电影名称 如何做到这一点 这是我的代码 table border 1 width 100 tr td t
  • Perl 中的“字符串化”是什么?

    在 CPAN 模块的文档中DateTime http search cpan org drolsky DateTime 0 66 lib DateTime pm Formatters And Stringification我发现了以下内容
  • 在 Swift 中子类化 UINavigationBar

    我正在尝试创建一个自定义UINavigationBar类 然后使用Storyboard将其设置为我的班级UINavigationController的导航栏 这是我的代码UINavigationBar class class CustomN
  • 使用外部服务的 Shopify 自定义搜索

    我的情况 我们有一个 Shopify 商店 我们还有一个在 AWS 上实施和托管的搜索引擎 我们需要使用该搜索引擎而不是 Shopify 商店中的默认 search 理想情况下 当用户尝试搜索某些内容时 他们的查询 以及可能的其他内容 例如
  • C++ 静态变量总是在主线程上被破坏吗?

    简短的问题 C 11 静态 非线程本地 变量是否总是在主线程上分散注意力 它们是否总是仅在程序退出时被销毁 考虑到我们不手动调用它们的析构函数 UPDATE 为了简洁起见 我们假设调用了析构函数 我们没有拔掉插头 我们没有杀死 9 全局对象
  • 使用“Runtime.getRuntime().exec”从 Java 启动的进程无法访问文件系统位置

    从 Java 启动的进程Runtime getRuntime exec权限较少 我在 JavaDocs 中没有看到对此的描述以及如何管理它 如何保证启动的进程具有相同的环境和权限 更多细节 编写轻量级 Eclipse 插件maven htt
  • 安全 Rust 中的转换会导致运行时错误吗?

    我正在摆弄一点Any和铸造只是为了更深入地了解 Rust 从 C 开始 我已经习惯了强制转换可能导致运行时异常 因为在 C 中强制转换基本上意味着亲爱的编译器 相信我 我知道我在做什么 请将其转换为int32因为我知道它会起作用 但是 如果