我正在努力学习Rust,我一直在思考char的宽度是4字节.我可以将char转换为u32,结果很好(它们都是4字节宽),然而,当我将u32转换为char时,Rust抱怨:

fn main() {
    let pizza_hex: u32 = 0x1f355;
    let pizza: char = '?'; // (pizza char: http://www.fileformat.info/info/unicode/char/1f355/index.htm)

    // pizza as hex = 1f355
    println!("pizza as hex = {:x}", pizza as u32);

    // size of pizza = 4
    println!("size of pizza = {}", std::mem::size_of_val(&pizza));

    // This doesn't work super well
    println!("{} == {}", pizza_hex as char, pizza);
}
error[E0604]: only `u8` can be cast as `char`, not `u32`
  --> src/main.rs:12:26
   |
12 |     println!("{} == {}", pizza_hex as char, pizza);
   |                          ^^^^^^^^^^^^^^^^^

知道为什么吗?

推荐答案

char是有效的u32值,但每u32not是有效的char.

持有有效Unicode代码点factors into memory safetychar的属性:

被认为是未定义的行为

  • Invalid values in primitive types, even in private fields and locals:
    • char中的一个值,代表或大于char::MAX.

要在运行时将u32转换为char,请try 以下操作:

if let Some(pizza_from_hex) = std::char::from_u32(pizza_hex) {
    println!("{} == {}", pizza_from_hex, pizza);
}

如果您只是不想在字符文字中使用令人毛骨悚然的Unicode字形,可以使用Unicode转义序列:

let pizza_from_hex = '\u{01f355}';

println!("{} == {}", pizza_from_hex, pizza);

Rust相关问答推荐

使用InlineTables序列化toml ArrayOfTables

空字符串转换为Box字符串时是否分配?<>

有没有更好的方法从HashMap的条目初始化 struct ?

如果成员都实现特征,是否在多态集合上实现部分重叠的特征?

默认特征实现中的生命周期问题

你是如何在铁 rust 一侧的金牛座获得应用程序版本的?

原始数组数据类型的默认trait实现

Tokio_Postgres行上未显示退回特性的生存期,且生命周期 不够长

有没有一种惯用的方法来判断VEC中是否存在变体?

铁 rust ,我的模块介绍突然遇到了一个问题

在Rust中判断编译时是否无法访问

变量需要parse()中的显式类型

在Rust内联程序集中使用字符串常量

如何以与平台无关的方式将OsString转换为utf-8编码的字符串?

Rust编译器通过哪些规则来确保锁被释放?

rust tokio::spawn 在 mutexguard 之后等待

预期的整数,找到 `&{integer}`

RAII 模式的 Rust 解决方案,用于在 new() 和 drop() 上修改另一个对象

Rustlings 切片原语

在传输不可复制的值时实现就地枚举修改