gpt4 book ai didi

casting - 强制转换成安全的 Rust 会导致运行时错误吗?

转载 作者:行者123 更新时间:2023-11-29 07:56:43 25 4
gpt4 key购买 nike

我正在摆弄 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 使其安全再次。当然,我可以在 Noneunwrap 来炸掉它,但这不是我的意思;)

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

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

最佳答案

在 Rust 中使用 as 进行转换非常有限。它只允许在原始数字和字符类型之间、指针和引用之间进行转换,以及从具体类型的值创建特征对象,仅此而已——例如,as 是不可重载的。因此,使用 as 进行强制转换始终不会出现 panic ,但如果您正在强制转换一个无法在目标类型中表示的值,您可能会观察到数字溢出,这可能是也可能不是理想的。

在 Rust 中,没有 C# 或 Java 中的强制转换运算符这样的东西。最接近它的是 std::mem::transmute(),它很像 C++ 中的 reinterpret_cast。然而,它不安全,甚至它也有其局限性 - 它只能转换具有相同大小的类型的值。

关于casting - 强制转换成安全的 Rust 会导致运行时错误吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32854394/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com