ベクトル#
[[データ型 #配列]] と比較して、Vectorは JS の配列の概念に似ています。要素の追加や削除ができますが、依然として同じ型の値のみを格納することができます。
let v: Vec<i32> = Vec::new();
let v = vec![1, 2, 3];
let num = v2.get(0); // Some(1)
let num = &v2[0];
// for inを使用して要素を反復処理する
for num in &mut v {
*num += 1
}
値をmoveすることでベクトルの要素を代入できるかどうか興味がありました。AI はできると言っていますが、提供されたサンプルコードはコンパイルできませんでした。自分でエラーメッセージE0507を書いてみました。
let v = vec![String::from(""), String::from("")];
let str = v[0];
// | move occurs because value has type `String`, which does not implement the `Copy` trait
文字列#
Rust の文字列は通常、&str
と呼ばれるslice参照で、UTF-8 データの参照です。String
も文字列であり、本質的には制約と機能のあるベクトルです。str は固定長であり、String はヒープ上に可変の内容を持っています。
両者は互換性があります:
let mut s = String::from("str");
let r = s.as_str();
変更#
let mut s = String::from("hello");
// 1文字を追加
s.push('_');
// 文字列を追加
s.push_str("world");
// +の右側は&strのみで、左側の変数の所有権が移動します
let s = s + "_rust";
// 所有権を取得せずに連結する
let s1 = String::from("!");
let str = format!("{s}{s1}!!")
ハッシュマップ#
ES6 の Map とほぼ同じ概念で、キーと値のペアを格納します。キーと値の型は固定されています。使用する際には所有権の問題に注意し、通常は参照またはクローンを使用します。
use std::collections::HashMap;
let mut hash = HashMap::new();
hash.insert(String::from("x"), 1);
let x = hash.get(&String::from("x"));
// 既存の値に基づいてデフォルト値を挿入する
let y = hash.entry(String::from("y")).or_insert(0);
Rust では、String の比較はアドレスではなく内容で行われることに気づきました:
Lv777: Rust で 2 つの String が同じ内容を持つ場合、これらの String は等しいですか?
Raycast AI: はい、Rust の 2 つの文字列が内容が同じであれば、それらは等しいです。これは、Rust の文字列がアドレスではなく内容に基づいて比較されるためです。
==
演算子を使用して 2 つの文字列を比較することができます。
Lv777: 他にも内容を比較するタイプはありますか?
Raycast AI: Rust の文字列の比較以外にも、他のタイプの比較も内容に基づいて行われます。たとえば、Rust の配列、スライス、タプルなどの型の比較も内容に基づいて行われます。
==
演算子を使用してそれらが等しいかどうかを比較することができます。
また、Rust の構造体や列挙型の比較は、デフォルトではメンバーの値に基づいて行われますが、メンバーの型が比較をサポートしていない場合は、PartialEq
とEq
トレイトを手動で実装する必要があります。