web-dev-qa-db-ja.com

Rustで文字列をintに変換しますか?

注:この質問には非推奨の1.0以前のコードが含まれています!答えは正しいですが。

Rustでstrintに変換するには、次のようにします。

let my_int = from_str::<int>(my_str);

Stringintに変換する方法を知っている唯一の方法は、そのスライスを取得し、その上でfrom_strを次のように使用することです:

let my_int = from_str::<int>(my_string.as_slice());

Stringintに直接変換する方法はありますか?

110
mtahmed

str::parse::<T>() method を使用して、intに直接変換できます。

let my_string = "27".to_string();  // `parse()` works with `&str` and `String`!
let my_int = my_string.parse::<i32>().unwrap();

上記のようにturbofish演算子(::<>)または明示的な型注釈を使用して、解析する型を指定できます。

let my_int: i32 = my_string.parse().unwrap();

コメントで述べたように、parse()Result を返します。指定したタイプとして文字列を解析できなかった場合、この結果はErrになります(たとえば、文字列"peter"i32として解析できません)。

156
John Vrbanac
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(),
}

parseNAME _core::result::Result<u32, core::num::ParseIntError>を返し、 unwrapNAME _ は値vを外に移動しますSome(v)の場合のオプション[または] self値がNoneの場合はパニックします。

parseNAME _汎用関数 であるため、山括弧で囲まれた型です。

38
Jared Beck

最近の夜間では、これを行うことができます:

let my_int = from_str::<int>(&*my_string);

ここで起こっているのは、Stringstrに逆参照できるようになったことです。ただし、関数は&strを必要とするため、再度借用する必要があります。参考までに、この特定のパターン(&*)は「クロスボローイング」と呼ばれます。

6
DK.

うーん、ダメ。なぜあるべきですか?不要になった文字列は破棄してください。

&strは、文字列の読み取りのみが必要な場合は、Stringよりも便利です。これは、データの所有者ではなく、元のデータへのビューにすぎないためです。 Stringよりも簡単に渡すことができ、コピー可能であるため、呼び出されたメソッドによって消費されません。これに関しては、より一般的です。Stringがある場合は、&strが期待される場所に渡すことができますが、&strがある場合は、Stringを期待する関数にのみ割り当てることができます。

公式文字列ガイド で、これら2つの違いとそれらをいつ使用するかについての詳細を見つけることができます。

0

FromStr traitのfrom_strメソッドを使用できます。これは、i32用に実装されています。

let my_num = i32::from_str("9").unwrap_or(0);
0

stdin().read_lineから文字列を取得する場合は、最初に文字列をトリミングする必要があります。

let my_num: i32 = my_num.trim().parse()
   .expect("please give me correct string number!");
0
Ade Yahya