使用安全Rust进行转换是否会导致运行时错误?

克里斯多夫

我稍微摆弄一下,Any并进行铸造,以更深入地了解Rust。从C#开始,我习惯于强制转换会导致运行时异常,因为在C#中强制转换基本上意味着Dear编译器,请相信我,我知道我在做什么,请将其强制转换为一个,int32因为我知道它将可以使用。

但是,如果您执行的是无效的转换,则程序将在运行时爆炸并带有Exception异常。所以我想知道(安全)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_refreturn,Option从而使它再次安全。当然,我可以unwrapNone将其炸毁,但是这不是我的观点;)

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

我知道防止运行时错误正是Rust的全部目的,所以这很有意义,我只想验证我的观察:)

弗拉基米尔·马特维夫(Vladimir Matveev)

使用asRust进行铸造非常有限。它仅允许在原始数字和字符类型之间进行转换,在指针和引用之间进行转换,以及根据具体类型的值创建特征对象,仅此而已-as例如,不可重载。因此,强制转换withas始终免于惊慌,尽管如果您强制转换无法用目标类型表示的值,则可能会观察到数值溢出,这可能是理想的,也可能是不理想的。

在Rust中,没有C#或Java中的强制转换运算符。最接近std::mem::transmute()它的是reinterpret_cast与C ++类似的东西unsafe然而,即使它有它的局限性-它只能变换具有相同大小类型的值。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

使用UglifyJS插件进行Webpack优化会导致运行时错误

使用Material Button会导致ClassNotFound运行时错误

循环中的Getpivotdata会导致运行时错误1004

插入公式会导致运行时错误1004

删除表控件会导致运行时错误

作业运行时,Jenkins是否会进行“ SCM投票”?

在Golang中,为什么这样的类型转换会导致运行时错误:索引超出范围?

在重载的全局new运算符中使用静态对象会导致核心转储运行时错误

为什么对字典使用隐式集合初始化器会导致C#中的运行时错误?

在虚拟函数周围使用#ifdef预处理器会导致在与库链接的程序中出现运行时错误

由于NSManagedObjectContextObjectsDidChangeNotification而导致的运行时错误

cin导致运行时错误

Else 语句导致运行时错误

从x到y的协变量数组转换可能会导致运行时异常

使用稀疏向量进行查询的Elasticsearch运行时错误

Rust是否会正式区分将编译时检查换为运行时检查的构造?

分配给 gslice_array 会导致运行时错误

在main()外部访问二维数组会导致运行时分段错误?

修改UI后调用Thread.sleep()似乎会导致运行时错误

在运行时设置extjs 6 combobox的存储数据会导致显示错误

在枚举上重载<<运算符会导致运行时错误

为什么切片长度大于容量长度会导致运行时错误?

在 XML 中绘制深灰色线会导致运行时错误

返回类成员引用变量会导致运行时错误

导入任何.d.ts会导致运行时错误

通过添加值更改字符串中的字符会导致运行时错误

将范围对象从 VBA 传递到 .NET 会导致“运行时错误 91”

尝试并除外会返回错误,但是在不运行时是否不会发生错误?

尝试在运行时使用反射更改属性的值会导致NullPointerException