将一个string转换为锈的int?
注意:这个问题包含已弃用的1.0之前的代码! 但答案是正确的。
要将一个str
转换为Rust中的一个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。
let my_string = "27".to_string(); // `parse()` works with `&str` and `String`! let my_int = my_string.parse::<i32>().unwrap();
您可以指定types来parsingturbofish运算符( ::<>
),如上所示或通过显式types注释:
let my_int: i32 = my_string.parse().unwrap();
如注释中所述, parse()
返回一个Result
。 如果string不能被parsing为指定的types(例如,string"peter"
不能被parsing为i32
),这个结果将是一个Err
。
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<u32, core::num::ParseIntError>
和core::result::Result<u32, core::num::ParseIntError>
“如果它是Some(v)将值移出Option(v)[or]如果自我值等于None, 。
parse
是一个通用的函数 ,因此在尖括号中的types。
最近晚上,你可以这样做:
let my_int = from_str::<int>(&*my_string);
这里发生的事情是String
现在可以被解引用到str
。 但是,函数需要一个&str
,所以我们不得不再次借用。 作为参考,我认为这种特殊模式( &*
)被称为“交叉借用”。
那么,不。 为什么应该有? 如果你不再需要,就丢弃这个string。
当你只需要读取一个string时, &str
比String
更有用,因为它只是一个查看原始数据的视图,而不是它的所有者。 您可以比String
更容易地传递它,并且它是可复制的,所以它不会被调用的方法使用。 在这方面,这是更一般的:如果你有一个String
,你可以把它传递到一个&str
所期望的地方,但是如果你有&str
,那么你只能把它传递给期望String
函数。
你可以find更多关于这两者之间的差异,以及何时在官方string指南中使用它们。