如何将usize转换为单个char?

时间:2018-04-20 10:06:14

标签: rust type-conversion

对于我为锻炼做的练习(minesweeper任务),我需要将usize转换为char才能将其插入{std::string::String 1}}。

用最少的代码行描述问题:

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)的目标?

3 个答案:

答案 0 :(得分:4)

我建议使用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);
}

编辑:根据新的示例案例更新代码

答案 1 :(得分:3)

  

然而,当将mine_count添加到std :: string :: String时,它会变成 - 例如 - \ u {2}而不仅仅是' 2'。

这是包含标量值char的{​​{1}}与包含实际字符2的{​​{1}}之间的差异。前几个UTF-8值(如ASCII文本编码)保留用于控制字符,并且不会显示可见的内容。在此上下文中将其显示为char的原因是您使用debug formatting'2')打印了字符串。如果您尝试使用纯格式打印相同的字符串:

\u{2}

输出将包含一些不打算打印的内容,因此可能会显示占位符或根本不显示(可重现的here)。

为了将一位数字表示为相应的字符:(1)首先确保{:?}在可预测的限制范围内,或者通过可恢复的错误或硬断言。 (2)然后,通过将数字转换为数字数字字符来转换数字。

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

Playground

答案 2 :(得分:0)

  

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

使用查找表:

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

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