微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何将 u32 常量转换为 i32 常量而不会在 Rust 中不安全?

如何解决如何将 u32 常量转换为 i32 常量而不会在 Rust 中不安全?

我试图从现有的 u32 常量定义一个新的 i32 常量,用于匹配表达式,因为 io::Error::raw_os_error() 返回一个 i32,但 winapi 错误常量是 u32。

在下面的代码示例中,现有的 u32 常量将为 ERROR_NO_MORE_FILES

我发现这样做的唯一方法是使用不安全的块。

我是 Rust 的新手,所以有没有办法在不安全的情况下将 u32 转换为 i32 常量?

use std::io::Error;
use std::convert::TryFrom;

const ERROR_NO_MORE_FILES: u32 = 18; // defined in winapi winerror
const ERROR_NO_MORE_FILES_I32: i32 = unsafe { ERROR_NO_MORE_FILES as i32 };
// Attempted to use safe conversion does not compile:
// error[E0015]: calls in constants are limited to constant functions,tuple structs and tuple variants
// const ERROR_NO_MORE_FILES_I32: i32 = i32::try_from(ERROR_NO_MORE_FILES).unwrap();

fn main() -> Result<(),Error> {
    let err = Error::last_os_error();
    match err.raw_os_error() { // an i32
        Some(ERROR_NO_MORE_FILES_I32)  => { println!("No more files..."); },Some(_) => return Err(err),_  => {}
    }
    Ok(())
}


解决方法

正如@loganfsmyth 指出的那样,在这种情况下我不需要 unsafe。我不确定我是如何设法错过警告的(可能应该这么晚才停止编码)...

这编译得很好:

const ERROR_NO_MORE_FILES: u32 = 18; // defined in winapi winerror
const ERROR_NO_MORE_FILES_I32: i32 = ERROR_NO_MORE_FILES as i32;

fn main() {
    println!("{}",ERROR_NO_MORE_FILES_I32);
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。