Преобразовать строку в 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, если вы сделайте новое выделение.

Вы можете узнать больше о различиях между этими двумя и когда их использовать в официальном руководстве по цепочкам.