Преобразовать строку в int в Rust?
Примечание: этот вопрос содержит устаревший код pre-1.0! Ответ правильный, однако.
Чтобы преобразовать a str
в int
в Rust, я могу сделать это:
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
Вы можете напрямую преобразовать в int с помощью метода str::parse::<T>()
.
let my_string = "27".to_string(); // `parse()` works with `&str` and `String`!
let my_int = my_string.parse::<i32>().unwrap();
Вы можете указать тип для синтаксического анализа с помощью турбовинтового оператора (::<>
), как показано выше, или с помощью аннотации явного типа:
let my_int: i32 = my_string.parse().unwrap();
Как указано в комментариях, parse()
возвращает Result
. Этот результат будет Err
, если строка не может быть проанализирована как заданный тип (например, строка "peter"
не может быть проанализирована как i32
).
Ответ 2
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>
и unwrap
"перемещает значение v из Опция, если это некоторые (v) [или] Паники, если значение self равно None".
parse
является общей функцией, следовательно, тип в угловых скобках.
Ответ 3
С недавним ночным вы можете сделать это:
let my_int = from_str::<int>(&*my_string);
Что здесь происходит, так это то, что String
теперь можно разыменовать в str
. Однако функция хочет &str
, поэтому нам нужно снова заимствовать. Для справки, я считаю, что эта конкретная модель (&*
) называется "кросс-заимствованием".
Ответ 4
Ну, нет. Почему это должно быть? Просто отбросьте строку, если она вам больше не понадобится.
&str
более полезен, чем String
, когда вам нужно только прочитать строку, потому что это только представление в исходную часть данных, а не ее владельца. Вы можете передать его более легко, чем String
, и он может быть скопирован, поэтому он не будет использоваться вызываемыми методами. В этом отношении это более общее: если у вас есть String
, вы можете передать его туда, где ожидается &str
, но если у вас есть &str
, вы можете передать его только функциям, ожидающим String
, если вы сделайте новое выделение.
Вы можете узнать больше о различиях между этими двумя и когда их использовать в официальном руководстве по цепочкам.