注意:这个问题包含过时的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());
有没有一种方法可以直接将String
转换为int
?
注意:这个问题包含过时的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());
有没有一种方法可以直接将String
转换为int
?
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
方法可以“展开”这个返回值,并提取其中的Ok
值,如果是Err
则会报错,并且错误信息由Err
的值提供。
str::parse
是一个泛型函数,因此在尖括号中指定了具体的类型。
如果您从stdin().read_line
获取字符串,则需要首先进行修剪。
let my_num: i32 = my_num.trim().parse()
.expect("please give me correct string number!");
最近的夜间版本中,您可以这样做:
let my_int = from_str::<int>(&*my_string);
这里发生的情况是,String
现在可以转换为 str
。但是函数需要一个 &str
,所以我们必须再次进行借用。参考一下,我相信这个特定的模式(&*
)被称为“交叉借用”。
String
进行解引用并希望它能正常工作。 - mmtauqirmy_string.as_slice()
表达为my_string[]
(目前slicing_syntax
是特征门控的,但最有可能某种形式会出现在该语言中)。 - tempestadepti32
实现的 FromStr
特质中的 from_str
方法。let my_num = i32::from_str("9").unwrap_or(0);
是的,您可以使用parse方法将一个字符串直接转换为整数,例如:
let my_string = "42".to_string();
let my_int = my_string.parse::<i32>().unwrap();
parse方法返回一个Result对象,因此您需要处理无法将字符串解析为整数的情况。您可以像上面展示的那样使用unwrap来获取值(如果解析成功),或者如果解析失败,它将会panic。
或者您可以使用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
},
};
需要注意的是,parse方法适用于任何实现FromStr trait的类型,它包括所有整数类型(例如i32、i64等)以及许多其他类型,例如f32和bool。
不需要。如果您不再需要字符串,请将其丢弃。
当您仅需要读取字符串时,&str
比String
更有用,因为它只是原始数据的视图,而不是所有者。您可以更轻松地传递它而不会被调用的方法消耗掉。在这方面,它更加通用:如果您有一个String
,则可以将其传递到期望&str
的位置,但是如果您有&str
,则只能将其传递给期望String
的函数,如果您进行新的分配。
您可以在官方字符串指南中了解有关这两者之间差异和何时使用它们的更多信息。
.as_slice()
来进行from_str
操作。例如,命令行参数是一个需要将所有参数解释为整数等类型的地方,我就需要使用from_str
函数。 - mmtauqiras_slice()
只是字符串处理的一个小方面。例如,您可以使用切片语法(s[]
)或利用Deref
强制转换(&*s
)。甚至有一个提案允许仅编写&s
。 - Vladimir Matveev&s
对于字符串会做什么?它会返回一个str
吗?你能指向提案的位置吗? - mmtauqirstr
,而是 &str
。它们虽然相关但却不同。前者是一种动态大小的类型,你几乎不会直接使用它,而后者是一个字符串切片,是一个胖指针。该提案称为 deref coercions;如果 T: Deref<U>
,它将允许从 &T
强制转换为 &U
。由于 String: Deref<str>
,因此你只需使用 &
就可以从 String
中获取 &str
。这仍在讨论中,但我怀疑在 1.0 版本之前不会发生 - 剩下的时间太少了。 - Vladimir Matveev所以基本上你想把一个字符串转换成整数是吧!这是我大部分使用的方法,它也在官方文档中提到了...
fn main() {
let char = "23";
let char : i32 = char.trim().parse().unwrap();
println!("{}", char + 1);
}
这适用于 String 和 &str 两种类型。希望这也能有所帮助。
use std::str::FromStr;
可以解决这个问题。如果您想了解更多关于 from_str 的内容,请参考https://doc.rust-lang.org/std/str/trait.FromStr.html#tymethod.from_str。 - cryptograthor