Convert a String to int in Rust?
注意:此问题包含1.0版之前的代码! 答案是正确的。
要将Rust中的str转换为int,我可以这样做:
1
| let my_int = from_str::<int>(my_str); |
我知道如何将String转换为int的唯一方法是获取它的切片,然后像这样使用from_str:
1
| let my_int = from_str::<int>(my_string.as_slice()); |
有没有一种方法可以直接将String转换为int?
-
另请参阅:stackoverflow.com/q/32381414/500207(非十进制)(即十六进制)。
您可以使用str::parse::< T >()方法直接转换为int。
1 2
| let my_string ="27".to_string(); // `parse()` works with `&str` and `String`!
let my_int = my_string.parse::<i32>().unwrap(); |
您可以使用上图所示的turbofish运算符(::<>)指定要解析的类型,也可以通过显式类型注释:
1
| let my_int: i32 = my_string.parse().unwrap(); |
如注释中所述,parse()返回Result。如果无法将字符串解析为指定的类型(例如,字符串"peter"不能解析为i32),则结果为Err。
-
请注意,parse返回一个Result,因此您需要适当地处理它以获得实际的整数类型。
-
太棒了! rustnoob在这里,您的答案正是我想要的! +1
1 2 3 4 5 6 7 8
| let my_u8: u8 ="42".parse::<u8>().unwrap();
let my_u32: u32 ="42".parse::<u32>().unwrap();
// or, to be safe, match the `Err`
match"foobar".parse::<i32>() {
Ok(n) => do_something_with(n),
Err(e) => weep_and_moan(),
} |
parse返回core::result::Result和unwrap"将值v从Option移出Some(v)[或]如果self值等于None则恐慌"。
parse是通用函数,因此在尖括号中输入类型。
-
如果指定变量的类型(let my_u8: u8),则不需要尖括号中的值。还要注意,流行的Rust风格表示:应该粘贴在左侧。
-
具体来说,我的意思是let my_u32: u32 ="42".parse().unwrap()
-
我因weep_and_moan函数而投票
对于最近的每晚,您可以执行以下操作:
1
| let my_int = from_str::<int>(&*my_string); |
这里发生的事情是现在可以将String取消引用到str中。但是,该函数需要&str,因此我们必须再次借用。作为参考,我相信这种特定的模式(&*)被称为"交叉借用"。
-
好的,我不是每天晚上都在做,但是我会接受它作为答案,因为我实际上曾经尝试过取消引用String并希望它能起作用。
-
或者,您可以将my_sttring.as_slice()表示为my_string[](当前slicing_syntax具有特征门功能,但很可能以该语言结尾某种形式)。
如果从stdin().read_line获取字符串,则必须先对其进行修剪。
1 2
| let my_num: i32 = my_num.trim().parse()
.expect("please give me correct string number!"); |
您可以使用FromStr特征的from_str方法,该方法是为i32实现的:
1
| let my_num = i32::from_str("9").unwrap_or(0); |
-
与" turbofish"方式相比,性能有何不同?
好吧,不。为什么要有?如果不再需要该字符串,则将其丢弃。
当您只需要读取一个字符串时,&str比String更为有用,因为它只是原始数据的视图,而不是其所有者。您可以比String更容易传递它,并且它是可复制的,因此被调用的方法不会使用它。在这方面,它比较笼统:如果有String,则可以将其传递到期望&str的位置,但是如果有&str,则只能将其传递给期望String的函数。重新分配。
您可以在官方字符串指南中找到有关这两者之间的区别以及何时使用它们的更多信息。
-
好吧,在我看来,"应该存在"的一个显而易见的原因是,我不需要在每次对String进行from_str时都必须执行.as_slice()。例如,命令行参数是我需要在所有arg上执行from_str并将其解释为int等的地方。
-
as_slice()只是字符串处理的次要方面。例如,您可以使用切片语法(s[])或利用Deref强制(&*s)。甚至有一个建议只允许写&s。
-
喔! &s对字符串会做什么?它会退回str吗?你能指出我的建议吗?
-
首先,str不是您要使用的;它是&str。它们是不同的(但相关)。前一种是动态大小的类型,您几乎永远不会直接使用它,而后一种是字符串切片,它是一个胖指针。该提议被称为反强制。如果T: Deref,它将允许从&T强制为&U。由于String: Deref已经存在,因此仅&就可以从String获得&str。它仍在讨论中,但我怀疑它会在1.0之前发生-剩下的时间太少了。