Uwaga: to pytanie zawiera przestarzały kod sprzed wersji 1.0! Jednak odpowiedź jest prawidłowa.
Aby przekonwertować a str
na an int
w Rust, mogę to zrobić:
let my_int = from_str::<int>(my_str);
Jedyny sposób, w jaki wiem, jak przekonwertować a String
na an, int
to uzyskać jego kawałek, a następnie użyć from_str
na nim w następujący sposób:
let my_int = from_str::<int>(my_string.as_slice());
Czy istnieje sposób na bezpośrednią konwersję a String
na int
?
use std::str::FromStr;
naprawia to. Więcej informacji na temat from_str, jeśli chcesz. doc.rust-lang.org/std/str/trait.FromStr.html#tymethod.from_strOdpowiedzi:
Możesz bezpośrednio przekonwertować na int za pomocą
str::parse::<T>()
metody .Możesz określić typ do analizy za pomocą operatora turbofish (
::<>
), jak pokazano powyżej, lub za pomocą jawnej adnotacji typu:Jak wspomniano w komentarzach,
parse()
zwraca plikResult
. Ten wynik będzie an,Err
jeśli nie można przeanalizować ciągu jako określonego typu (na przykład ciągu"peter"
nie można przeanalizować jakoi32
).źródło
parse
zwraca aResult
, więc musisz sobie z tym odpowiednio poradzić, aby uzyskać rzeczywisty typ całkowy.str::parse::<u32>
zwraca aResult<u32, core::num::ParseIntError>
iResult::unwrap
„Rozpakowuje wynik, dając zawartośćOk
paniki [lub], jeśli wartością jest anErr
, z komunikatem paniki dostarczonym przez wartośćErr
's."str::parse
jest funkcją ogólną , stąd typ w nawiasach ostrych.źródło
let my_u8: u8
), nie potrzebujesz wartości w nawiasach ostrych. Zwróć również uwagę, że dominujący styl Rust wskazuje, że:
powinien on trzymać się lewej strony.let my_u32: u32 = "42".parse().unwrap()
Jeśli otrzymujesz swój ciąg z
stdin().read_line
, musisz go najpierw przyciąć.źródło
Korzystając z ostatniej nocy, możesz to zrobić:
To, co się tutaj dzieje, to to, że
String
można teraz dereferencjonować dostr
. Jednak funkcja wymaga&str
, więc musimy ponownie pożyczyć. Dla porównania uważam, że ten konkretny wzorzec (&*
) jest nazywany „pożyczaniem krzyżowym”.źródło
String
w pewnym momencie próbowałem wyłuskać a i miałem nadzieję, że zadziała.my_sttring.as_slice()
jakomy_string[]
(obecnieslicing_syntax
jest ograniczony funkcjami, ale najprawdopodobniej jakaś jego forma skończy się w języku).Możesz użyć
FromStr
cechyfrom_str
, która jest zaimplementowana dlai32
:źródło
Więc nie. Dlaczego miałoby być? Po prostu wyrzuć ciąg, jeśli już go nie potrzebujesz.
&str
jest bardziej przydatny niżString
wtedy, gdy trzeba tylko odczytać ciąg, ponieważ jest to tylko wgląd do oryginalnej części danych, a nie ich właściciel. Możesz go łatwiej przekazać niżString
i jest kopiowalny, więc nie jest używany przez wywoływane metody. W tym względzie jest bardziej ogólny: jeśli masz aString
, możesz przekazać go tam, gdzie&str
jest oczekiwane, ale jeśli masz&str
, możesz przekazać go tylko do funkcji oczekujących,String
jeśli dokonasz nowego przydziału.Więcej informacji na temat różnic między tymi dwoma i kiedy ich używać można znaleźć w oficjalnym przewodniku po strunach .
źródło
.as_slice()
każdym razem, gdy muszę to zrobićfrom_str
na String. Na przykład argumenty wiersza poleceń to jedno miejsce, w którym muszę zrobićfrom_str
na wszystkich argumentach, aby zinterpretować je jakoint
s itp.as_slice()
jest tylko pomniejszym aspektem obsługi ciągów. Na przykład możesz użyć składni wycinania (s[]
) lub wykorzystaćDeref
coercion (&*s
). Jest nawet propozycja, która pozwoliłaby po prostu pisać&s
.&s
zrobił dla sznurka? Czy to odwdzięczy sięstr
? Czy możesz wskazać mi propozycję?str
nie jest tym, z czym pracujesz; to jest&str
. Są różne (ale powiązane). Pierwszy z nich to typ o dynamicznej wielkości, którego prawie nigdy nie używałbyś bezpośrednio, podczas gdy drugi to kawałek struny, który jest wskaźnikiem tłuszczu. Propozycja ta nazywa się przymusem deref ; pozwoliłoby wymusić od&T
do&U
jeśliT: Deref<U>
. PonieważString: Deref<str>
już będziesz w stanie uzyskać&str
odString
z tylko&
. Nadal toczy się dyskusja, ale wątpię, że stanie się to przed 1.0 - zostało za mało czasu.Więc zasadniczo chcesz przekonwertować String na liczbę całkowitą, prawda! tutaj jest to, czego najczęściej używam i jest to również wspomniane w oficjalnej dokumentacji.
Działa to zarówno dla String, jak i & str. Mam nadzieję, że to też pomoże.
źródło