注意:此问题包含1.0之前已弃用的代码!不过答案是正确的。

在Rust中将str转换为int,我可以这样做:

let my_int = from_str::<int>(my_str);

我知道如何将String转换为int的唯一方法是获取它的切片,然后使用from_str对它这样:

let my_int = from_str::<int>(my_string.as_slice());

是否有一种方法可以直接将字符串转换为int?


当前回答

是的,你可以在String上使用parse方法直接将其转换为整数,就像这样:

let my_string = "42".to_string();
let my_int = my_string.parse::<i32>().unwrap();

解析方法返回一个Result对象,因此需要处理字符串不能解析为整数的情况。如果解析成功,您可以使用上面所示的unwrap来获取值,如果解析失败,则会出现恐慌。

或者你可以使用match表达式分别处理成功和失败的情况,如下所示:

let my_string = "42".to_string();
let my_int = match my_string.parse::<i32>() {
    Ok(n) => n,
    Err(_) => {
        println!("Failed to parse integer");
        0
    },
};

仅供参考,该解析方法可用于实现FromStr特征的任何类型,其中包括所有整数类型(例如i32, i64等)以及许多其他类型,如f32和bool。

其他回答

在最近的一个晚上,你可以这样做:

let my_int = from_str::<int>(&*my_string);

这里发生的事情是String现在可以被解引用为str。然而,该函数需要一个&str,所以我们必须再次借位。作为参考,我认为这种特殊的模式(&*)被称为“交叉借用”。

你可以使用FromStr trait的from_str方法,这是为i32实现的:

let my_num = i32::from_str("9").unwrap_or(0);

嗯,没有。为什么会有呢?如果不再需要,就丢弃字符串。

当你只需要读取一个字符串时,&str比String更有用,因为它只是原始数据的一个视图,而不是它的所有者。您可以比String更容易地传递它,而且它是可复制的,因此它不会被调用的方法使用。在这方面,它更一般:如果你有一个String,你可以将它传递到需要&str的地方,但如果你有&str,你只能在进行新的分配时将它传递给需要String的函数。

你可以在官方的字符串指南中找到更多关于这两者之间的区别以及何时使用它们的信息。

可以使用str::parse::<T>()方法直接转换为int类型,该方法返回一个包含int类型的Result。

let my_string = "27".to_string();  // `parse()` works with `&str` and `String`!
let my_int = my_string.parse::<i32>().unwrap();

你可以使用turbofish操作符(::<>)如上所示指定要解析的类型,也可以通过显式类型注释:

let my_int: i32 = my_string.parse().unwrap();

由于parse()返回一个Result,如果字符串不能被解析为指定的类型(例如,字符串"peter"不能被解析为i32),它将是一个Err,或者是一个Ok值。

let my_u8: u8 = "42".parse().unwrap();
let my_u32: u32 = "42".parse().unwrap();

// or, to be safe, match the `Err`
match "foobar".parse::<i32>() {
  Ok(n) => do_something_with(n),
  Err(e) => weep_and_moan(),
}

str::parse::<u32>返回一个Result<u32, core::num::ParseIntError>和Result::unwrap“打开一个结果,如果值是Err,则产生一个Ok[或]panic的内容,并由Err的值提供一个恐慌消息。”

Str::parse是一个泛型函数,因此类型在尖括号内。