Примечание: этот вопрос содержит устаревший код до 1.0! Ответ правильный, хотя.
Чтобы преобразовать str
в int
в Русте, я могу это сделать:
let my_int = from_str::<int>(my_str);
Единственный способ, которым я знаю, как преобразовать a String
в a, int
состоит в том, чтобы получить его часть, а затем использовать from_str
его следующим образом:
let my_int = from_str::<int>(my_string.as_slice());
Есть ли способ напрямую преобразовать String
в int
?
use std::str::FromStr;
исправляет это. Больше на from_str, если хотите. doc.rust-lang.org/std/str/trait.FromStr.html#tymethod.from_strОтветы:
Вы можете напрямую конвертировать в int, используя
str::parse::<T>()
метод .Вы можете указать тип для анализа с помощью оператора turbofish (
::<>
), как показано выше, или с помощью явной аннотации типа:Как указано в комментариях,
parse()
возвращаетResult
. Этот результат будет,Err
если строка не может быть проанализирована как указанный тип (например, строка"peter"
не может быть проанализирована какi32
).источник
parse
возвращает aResult
, поэтому вам нужно соответствующим образом разобраться с этим, чтобы получить фактический целочисленный тип.str::parse::<u32>
возвращает aResult<u32, core::num::ParseIntError>
иResult::unwrap
«разворачивает результат, получая содержимоеOk
паники [или], если значение равноErr
, с сообщением паники, предоставленнымErr
значением s».str::parse
является универсальной функцией , поэтому тип в угловых скобках.источник
let my_u8: u8
), вам не понадобится значение в угловых скобках. Также обратите внимание, что преобладающий стиль Rust указывает на то, что:
следует придерживаться левой стороны.let my_u32: u32 = "42".parse().unwrap()
Если вы получили свою строку
stdin().read_line
, вы должны сначала обрезать ее.источник
С недавнего вечера вы можете сделать это:
То, что происходит здесь,
String
теперь может быть разыменовано вstr
. Тем не менее, функция хочет&str
, поэтому мы должны снова позаимствовать. Для справки, я считаю, что этот конкретный шаблон (&*
) называется «перекрестное заимствование».источник
String
в одном месте и надеялся, что это сработает.my_sttring.as_slice()
какmy_string[]
(в настоящее времяslicing_syntax
это функциональный, но, скорее всего, какая-то его форма окажется в языке).Вы можете использовать метод
FromStr
чертыfrom_str
, который реализован дляi32
:источник
Ну нет. Почему там должно быть? Просто отбросьте строку, если она вам больше не нужна.
&str
это более полезно, чемString
когда вам нужно только прочитать строку, потому что это только просмотр исходного фрагмента данных, а не его владельца. Вы можете передать его более легко, чемString
, и он может быть скопирован, поэтому он не используется вызываемыми методами. В этом отношении он является более общим: если у вас естьString
, вы можете передать его туда, где&str
ожидается, но если у вас есть&str
, вы можете передать его только функциям, ожидающим,String
если вы сделаете новое распределение.Вы можете найти больше информации о различиях между ними и о том, когда их использовать, в официальном руководстве по строкам .
источник
.as_slice()
каждый раз, когда мне нужно делатьfrom_str
со строкой. Например, аргументы командной строки - это единственное место, где мне нужно сделатьfrom_str
все аргументы, чтобы интерпретировать их какint
s и т. Д.as_slice()
это только второстепенный аспект обработки строк. Например, вы можете использовать синтаксис нарезки (s[]
) или использоватьDeref
coercion (&*s
). Есть даже предложение, которое позволило бы написать просто&s
.&s
сделать для строки? Это дастstr
назад? Не могли бы вы указать мне на предложение?str
это не то, с чем вы работаете; это так&str
. Они разные (но связанные). Первый тип представляет собой динамически изменяемый тип, который вы почти никогда не будете использовать напрямую, а второй - фрагмент строки, который является толстым указателем. Предложение называется deref принуждения ; это позволило бы привести&T
к&U
еслиT: Deref<U>
. ПосколькуString: Deref<str>
уже вы сможете получить&str
сString
помощью только что&
. Это все еще обсуждается, но я сомневаюсь, что это произойдет до 1.0 - осталось слишком мало времени.Таким образом, в основном вы хотите преобразовать строку в целое число правильно! вот что я в основном использую, и это также упоминается в официальной документации ..
Это работает как для String, так и & str. Надеюсь, это тоже поможет.
источник