我正在尝试存储string
(或str
)个数字,例如12345
放入向量中,以使向量包含{1,2,3,4,5}
。
由于我对Rust完全不熟悉,我遇到类型问题(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) );
}
}
答案 0 :(得分: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)
检查Some
是否已返回Option
的{{1}}变体。
拼凑在一起,代码现在看起来像这样:
if let Some(digit) = ch.to_digit(10)
现在,这是非常必要的:你正在制作一个矢量并逐个填充它,所有这些都是你自己。您可以通过对字符串应用转换来尝试更多declarative or functional方法:
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);
}
答案 1 :(得分:3)
ArtemGr的答案相当不错,但他们的版本会跳过任何不是数字的字符。如果你想让它在坏数字上失败,你可以使用这个版本:
fn to_digits(text: &str) -> Option<Vec<u32>> {
text.chars().map(|ch| ch.to_digit(10)).collect()
}
fn main() {
println!("{:?}", to_digits("731671"));
println!("{:?}", to_digits("731six71"));
}
输出:
Some([7, 3, 1, 6, 7, 1])
None
答案 2 :(得分:0)
Rust的新版本
如果转换为数字失败,则返回一个枚举。
#[derive(Debug, PartialEq)]
pub enum Error {
InvalidDigit(char),
}
fn to_digits(text: &str) -> Result<Vec<u32>, Error> {
let mut numbers = Vec::new();
for s in string_digits.chars(){
match s.to_digit(10){
Some(number) => numbers.push(number),
None => {return Err(Error::InvalidDigit(s));}
}
Ok(numbers)
}