注:この質問には非推奨の1.0以前のコードが含まれています!答えは正しいですが。
Rustでstr
をint
に変換するには、次のようにします。
let my_int = from_str::<int>(my_str);
String
をint
に変換する方法を知っている唯一の方法は、そのスライスを取得し、その上でfrom_str
を次のように使用することです:
let my_int = from_str::<int>(my_string.as_slice());
String
をint
に直接変換する方法はありますか?
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
として解析できません)。
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
NAME _ はcore::result::Result<u32, core::num::ParseIntError>
を返し、 unwrap
NAME _ は値vを外に移動しますSome(v)の場合のオプション[または] self値がNoneの場合はパニックします。
parse
NAME _ は 汎用関数 であるため、山括弧で囲まれた型です。
最近の夜間では、これを行うことができます:
let my_int = from_str::<int>(&*my_string);
ここで起こっているのは、String
をstr
に逆参照できるようになったことです。ただし、関数は&str
を必要とするため、再度借用する必要があります。参考までに、この特定のパターン(&*
)は「クロスボローイング」と呼ばれます。
うーん、ダメ。なぜあるべきですか?不要になった文字列は破棄してください。
&str
は、文字列の読み取りのみが必要な場合は、String
よりも便利です。これは、データの所有者ではなく、元のデータへのビューにすぎないためです。 String
よりも簡単に渡すことができ、コピー可能であるため、呼び出されたメソッドによって消費されません。これに関しては、より一般的です。String
がある場合は、&str
が期待される場所に渡すことができますが、&str
がある場合は、String
を期待する関数にのみ割り当てることができます。
公式文字列ガイド で、これら2つの違いとそれらをいつ使用するかについての詳細を見つけることができます。
FromStr
traitのfrom_str
メソッドを使用できます。これは、i32
用に実装されています。
let my_num = i32::from_str("9").unwrap_or(0);
stdin().read_line
から文字列を取得する場合は、最初に文字列をトリミングする必要があります。
let my_num: i32 = my_num.trim().parse()
.expect("please give me correct string number!");