注意:此问题包含已弃用的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?
u5rb5r591#
您可以使用str::parse::<T>()方法直接转换为int,其中returns a Result包含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
pepwfjgg2#
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是generic function,因此类型在尖括号中。
str::parse::<u32>
Result<u32, core::num::ParseIntError>
Result::unwrap
str::parse
7dl7o3gd3#
如果从stdin().read_line得到字符串,则必须首先修剪它。
stdin().read_line
let my_num: i32 = my_num.trim().parse() .expect("please give me correct string number!");
mitkmikd4#
对于最近的每晚,您可以执行以下操作:
let my_int = from_str::<int>(&*my_string);
这里发生的事情是String现在可以被解引用为str。然而,函数需要&str,所以我们必须再次借用。作为参考,我相信这个特定的模式(&*)被称为“交叉借用”。
&str
&*
relj7zay5#
您可以使用FromStr trait的from_str方法,该方法是为i32实现的:
FromStr
let my_num = i32::from_str("9").unwrap_or(0);
o4tp2gmn6#
嗯,没有。为什么要有呢?如果你不再需要它了,就把它扔掉。当你只需要读取一个字符串时,&str比String更有用,因为它只是原始数据的一个视图,而不是它的所有者。你可以比String更容易地传递它,而且它是可复制的,所以它不会被调用的方法使用。在这方面,它更通用:如果你有一个String,你可以把它传递给期望&str的地方,但是如果你有&str,你只能把它传递给期望String的函数,如果你做了一个新的分配。您可以找到更多关于这两者之间的差异以及何时在official strings guide中使用它们的信息。
e4eetjau7#
所以基本上你想把一个字符串转换成一个整数对吧!这里是我最常用的,这也是在官方文档中提到的。
fn main() { let char = "23"; let char : i32 = char.trim().parse().unwrap(); println!("{}", char + 1); }
这对String和&str都有效,希望这也能有所帮助。
polkgigr8#
是的,您可以使用字符串的解析方法直接将其转换为整数,如:
let my_string = "42".to_string(); let my_int = my_string.parse::<i32>().unwrap();
parse方法返回一个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 }, };
仅供参考,parse方法可用于实现FromStr特征的任何类型,包括所有整数类型(例如i32、i64等)以及许多其他类型,如f32和bool。
8条答案
按热度按时间u5rb5r591#
您可以使用
str::parse::<T>()
方法直接转换为int,其中returns a Result包含int。可以如上所示使用turbofish操作符(
::<>
)或通过显式类型注解指定要解析的类型:由于
parse()
返回一个Result
,所以如果字符串不能被解析为指定的类型(例如,字符串"peter"
不能被解析为i32
),它将是一个Err
,或者是一个包含值的Ok
。pepwfjgg2#
str::parse::<u32>
返回Result<u32, core::num::ParseIntError>
和Result::unwrap
“展开结果,生成Ok
的内容[或]如果值是Err
,则会出现异常,并由Err
的值提供异常消息。”str::parse
是generic function,因此类型在尖括号中。7dl7o3gd3#
如果从
stdin().read_line
得到字符串,则必须首先修剪它。mitkmikd4#
对于最近的每晚,您可以执行以下操作:
这里发生的事情是
String
现在可以被解引用为str
。然而,函数需要&str
,所以我们必须再次借用。作为参考,我相信这个特定的模式(&*
)被称为“交叉借用”。relj7zay5#
您可以使用
FromStr
trait的from_str
方法,该方法是为i32
实现的:o4tp2gmn6#
嗯,没有。为什么要有呢?如果你不再需要它了,就把它扔掉。
当你只需要读取一个字符串时,
&str
比String
更有用,因为它只是原始数据的一个视图,而不是它的所有者。你可以比String
更容易地传递它,而且它是可复制的,所以它不会被调用的方法使用。在这方面,它更通用:如果你有一个String
,你可以把它传递给期望&str
的地方,但是如果你有&str
,你只能把它传递给期望String
的函数,如果你做了一个新的分配。您可以找到更多关于这两者之间的差异以及何时在official strings guide中使用它们的信息。
e4eetjau7#
所以基本上你想把一个字符串转换成一个整数对吧!这里是我最常用的,这也是在官方文档中提到的。
这对String和&str都有效,希望这也能有所帮助。
polkgigr8#
是的,您可以使用字符串的解析方法直接将其转换为整数,如:
parse方法返回一个Result对象,因此您需要处理字符串不能解析为整数的情况。如果解析成功,您可以使用如上所示的unwrap来获取值,如果解析失败,它将出现异常。
或者,您可以使用match表达式分别处理成功和失败的情况,如下所示:
仅供参考,parse方法可用于实现FromStr特征的任何类型,包括所有整数类型(例如i32、i64等)以及许多其他类型,如f32和bool。