rust 如何将一个usize转换为一个char?

wfveoks0  于 2022-11-12  发布在  其他
关注(0)|答案(4)|浏览(248)

对于我正在做的Exercism练习(minesweeper任务),我需要将usize转换为char,以便将其插入std::string::String
要用最少的代码行描述问题:

let mut s = String::from("   ");
let mine_count: usize = 5; // This is returned from a method and will be a value between 1 and 8.
s.insert(0, _______); // So I get: "5  " at the underscores I do:

我目前的做法是:

mine_count.to_string().chars().nth(0).unwrap(); // For example: '2'

或者看看full example in the Rust playground。不知何故,这让我觉得不太优雅。
我也试过:

mine_count as char; // Where mine_count is of type u8

然而,当把mine_count加到std::string::String上时,它会变成--例如--\u{2},而不是简单的'2'

let mine_count: u8 = 8;
s.insert(0, mine_count as char);
println!("{:?}", s);

输出:

"\u{8}   "

复制here
是否有其他方法可以实现将1..8范围内的整数转换为单个字符(char)的目标?

ckx4rj1h

ckx4rj1h1#

我建议将char::from_digit与使用它所需的转换(as u32)一起使用:

use std::char;

fn main() {
    let mut s = String::from("   ");
    let mine_count: u8 = 8; // or i8 or usize
    s.insert(0, char::from_digit(mine_count as u32, 10).unwrap());

    println!("{:?}", s);
}
7dl7o3gd

7dl7o3gd2#

然而,当把mine_count加到一个std::string::String上时,它会变成--例如--\u{2},而不是简单的'2'
这就是包含标量值2char与包含实际字符'2'char之间的区别。并且不描绘可见的东西。在此上下文中使其显示为\u{2}的原因是您将字符串打印为debug formatting{:?})。如果您尝试以一般格式打印相同的字串:

let mut s = String::from("   ");
let mine_count: u8 = 8;
s.insert(0, mine_count as char);
println!("{}", s);

输出将包含不打算打印的内容,因此可能会显示占位符字符或根本不显示(可重现here)。
为了将一位数字表示为相应的字符:(1)首先通过可恢复的错误或硬Assert来确保mine_count在预期的限制内。(2)然后,通过将其转换为数字字符域来转换该数。

assert!(mine_count > 0);
assert!(mine_count < 9);
let mine_char = (mine_count + b'0') as char;
s.insert(0, mine_char);
println!("{}", s);

Playground

sy5wg1nm

sy5wg1nm3#

是否有其他方法可以实现将1..8范围内的整数转换为单个字符的目标
使用查阅表格:

const LABELS: [char; 9] = ['0', '1', '2', '3', '4', '5', '6', '7', '8'];

fn main() {
    LABELS[6_usize];
}
v1uwarro

v1uwarro4#

让我们这样做吧:

let data = 10;
let result = char::from_digit(data as u32, 10);

println!("{}", result); // Using the println! macro from the standard library

相关问题