文字列#
- Rust の文字列は JavaScript のものと大きな違いがあることに気づきました!!すべての言語を学ぶ際に一つの言語の思考を使ってはいけません。
String
はVec<u8>
のラッパーであり、本当の文字列ではありません!
- 文字列を作成する
`String::new`は空の文字列インスタンスを作成するために使用され、引数はありません
let mut s =String::new();
`String::from`は文字列インスタンスを作成するために使用され、&str型を引数として使用します
let mut ss=String::from("私はrustです");
// 同等
let mut ss="私はrustです".to_string();
エディタが返す型は同じなので、日常的に使用する際には好きな方を使えばいいです。
- よく使う文字列操作
// 文字列の長さを返す
ss.len(); // 10
// 文字列が空かどうかを返す
ss.is_empyt(); // false
// 文字列をバイト値に変換
ss.into_bytes(); // [230, 136, 145, 230, 152, 175, 114, 117, 115, 116, 229, 164, 169, 228, 184, 139, 230, 151, 160, 230, 149, 140]
// 小文字に変換
ss.to_lowercase(); // 私はrustです
// 大文字に変換
ss.to_uppercase();// 私はRUSTです
// 前後の空白を削除した文字列スライスを返す
ss.trim();// 私はrustです
// 文字列スライスを他の型に解析
let num:u32 = "22".parse().unwarp();
// 文字列を追加、&str型を受け取る
ss.push_str("天下無敵"); // 私はrustです天下無敵
// 文字は3バイトを占有するため、エラーが発生します。アルファベットを使用する場合は正常です
// もしssの値がrustであれば
ss.insert_str(1,"天下無敵"); // r天下無敵ust
// パラメータ値が含まれているかどうかを確認
ss.contains("r") // true
// 先頭にパラメータ値が含まれているかどうかを確認
ss.start_with("私") // true
// 終わりにパラメータ値が含まれているかどうかを確認
ss.end_with("t") // true
// バイトのインデックス値を確認
ss.find("r") // Some(6)
// 文字列の置換
ss.replace("rust", "c++") // 私はc++です
数値#
整数#
符号付きと符号なしの違いは負の値を持つことができるかどうかです
- 負の値を持つ可能性がある値には符号付きの型を使用します
- 常に正の値を持つ値には符号なしの型を使用します
長さ | 符号付き | 符号なし |
---|---|---|
8 | i8 | u8 |
16 | i16 | u16 |
32 | i32 | u32 |
64 | i64 | u64 |
128 | i128 | u128 |
arch | isize | usize |
浮動小数点型#
f32
とf64
rust のデフォルトの浮動小数点型は ****f64** です
一部の簡単な演算と組み込みメソッド#
let sum = 99 + 1; // 100
let difference = 100 - 1; // 99
let multip = 4 * 30; // 120
let div = 6 / 3; // 2
let truncated = -6 / 3; // -2
let remainder = 43 % 5; // 3
// 絶対値
(-10i32).abs(); // 10
// 絶対差
(-10i32).abs_diff(5); // 15
ブール#
他の言語と大きな違いはありません
タプル#
使用シーン
- 関数の引数の渡し
- 戻り値の型
let tuple = (5, "Rust", true);
// アクセス
let number = tuple.0; // 5
let student_tuple = ("RR", 100);
fn tuple_match((name,score):(&str,u32))-> String{
match score{
90..=100 => format!("{}のコースで素晴らしいパフォーマンスを発揮し、成績は{}です、優秀!",
80..=89 => format!("{}のコースで良好なパフォーマンスを発揮し、成績は{}です、良好!", course_name, score),
70..=79 => format!("{}のコースで普通のパフォーマンスを発揮し、成績は{}です、合格!", course_name, score),
_ => format!("{}のコースで努力が必要で、成績は{}です、不合格です。", course_name, score),
}
}
tuple_match(student_tuple) // RRのコースで素晴らしいパフォーマンスを発揮し、成績は100です、優秀!
配列#
Array#
- 固定長の要素集合で、型は統一される必要があります。
- 新規追加や削除操作はサポートされていません。
let mut numbers: [i32; 5] = [1, 2, 3, 4, 5];
// 配列要素へのアクセス
println!("最初の要素: {}", numbers[0]);
println!("最後の要素: {}", numbers[4]);
// 配列内の要素を変更
numbers[2] = 20;
println!("変更後の第三の要素: {}", numbers[2]);
// 配列を反復処理
for elem in numbers.iter() {
println!("{}", elem);
}
// 配列リテラルを使用して配列を作成
let array_literal: [i32; 6] = [0; 6];
println!("リテラルで初期化された配列: {:?}", array_literal);
Vec#
- 動的サイズの要素集合
- 新規追加や削除操作をサポートします。
let mut vec: Vec<i32> = Vec::new();
vec.push(1);
vec.push(2);
vec.push(3);
// 同等
let mut vec = vec![1,2,3];
// 同等
let mut vec = Vec::from([1, 2, 3]);
vec.len(); // 2
// 最後の要素値をポップ
vec.pop(); // Some(2)
// 新規追加
vec.push(99); // [1,2,3,99]
// インデックスに基づいて値を削除
vec.remove(0); // [2,3]
// 値を確認
vec.contains(&3); // true
// ソート
vec!["hello", "world"].join(" "); // hello world
vec.sort(); // [1,2,3]
// スライス、スライス要素のイテレータを返す
let mut chunks= vec.chunks(2);
chunks.next().unwrap(); // &[1,2]
chunks.next().unwrap(); // &[3]
// アクセス
println!("最初の要素: {}", vec[0]);
println!("最後の要素: {}", vec[2]);
// 反復処理
for i in vec{
println!("リテラルで初期化された配列: {}", i);
}