如何将一串数字转换为数字向量?

dan*_*ani 2 string type-conversion char rust

我试图将一个string(或str)数字存储12345到一个向量中,以便向量包含{1,2,3,4,5}.

正如我完全新生锈,我有同类型(的问题String,str,char,...),但还缺少有关转换的任何信息.

我当前的代码如下所示:

fn main() {
    let text = "731671";                
    let mut v: Vec<i32>;
    let mut d = text.chars();
    for i in 0..text.len() {
        v.push( d.next().to_digit(10) );
    }
}
Run Code Online (Sandbox Code Playgroud)

Art*_*mGr 7

你很亲密!

首先,索引循环for i in 0..text.len()不是必需的,因为无论如何你都要使用迭代器.直接在迭代器上循环更简单:for ch in text.chars().不仅如此,您的索引循环和字符迭代器可能会发散,因为len()返回字节数并chars()返回Unicode标量值.作为UTF-8,字符串的Unicode标量值可能少于字节数.

下一个障碍是to_digit(10)返回一个Option,告诉你该角色有可能不是一个数字.您可以检查是否to_digit(10)返回SomeOptionwith 的变体if let Some(digit) = ch.to_digit(10).

拼凑在一起,代码现在看起来像这样:

fn main() {
    let text = "731671";
    let mut v = Vec::new();
    for ch in text.chars() {
        if let Some(digit) = ch.to_digit(10) {
            v.push(digit);
        }
    }
    println!("{:?}", v);
}
Run Code Online (Sandbox Code Playgroud)

现在,这是相当迫切的:你正在制作一个矢量并逐个填充它,所有这些都是你自己.您可以通过对字符串应用转换来尝试更具声明性或功能性的方法:

fn main() {
    let text = "731671";
    let v: Vec<u32> = text.chars().flat_map(|ch| ch.to_digit(10)).collect();
    println!("{:?}", v);
}
Run Code Online (Sandbox Code Playgroud)