注意:此问题包含1.0之前已弃用的代码!不过答案是正确的。
要在Rust中将str转换为int,我可以这样做:
str
int
let my_int = from_str::<int>(my_str);
我知道如何将String转换为int的唯一方法是获取它的一个切片,然后对其使用from_str,如下所示:
String
from_str
let my_int = from_str::<int>(my_string.as_slice());
是否有方法直接将String转换为int?
在最近的一个晚上,你可以这样做:
let my_int = from_str::<int>(&*my_string);
这里发生的事情是String现在可以被解引用为str。然而,该函数需要&str,因此我们必须再次借位。作为参考,我相信这个特殊的模式(&*)被称为“交叉借用”。
&str
&*
嗯,没有。为什么会有呢?如果不再需要,就丢弃字符串。
当你只需要读取一个字符串时,&str比String更有用,因为它只是原始数据的一个视图,而不是它的所有者。你可以比String更容易地传递它,而且它是可复制的,所以它不会被调用的方法使用。在这方面,它更一般:如果你有String,你可以将它传递给&str,但如果你有&str,你只能在进行新的分配时将它传递给期望String的函数。
你可以在官方弦指南中找到更多关于这两者之间的区别以及何时使用它们的信息。
可以使用str::parse::<T>()方法直接转换为int型,其中返回一个结果包含int型。
str::parse::<T>()
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。
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[或]panics的内容,并由Err的值提供恐慌消息。
str::parse::<u32>
Result<u32, core::num::ParseIntError>
Result::unwrap
str::parse是泛型函数类型,因此是尖括号中的类型。
str::parse
你可以使用FromStr特征的from_str方法,该方法是为i32实现的:
FromStr
let my_num = i32::from_str("9").unwrap_or(0);
如果你从stdin().read_line获取字符串,你必须先修剪它。
stdin().read_line
let my_num: i32 = my_num.trim().parse() .expect("please give me correct string number!");
fn main() { let char = "23"; let char : i32 = char.trim().parse().unwrap(); println!("{}", char + 1); }