第一遍边抄示例边看文档、一天能过两大章、现在写着笔记、两天不过半章。😔
可変性#
特定のフィールドの値を変更したい場合、構造体のインスタンスは変更可能でなければなりません。
構造体の更新構文#
構造体の更新構文 は、JS の Spread 構文に少し似ていますが、古いインスタンスから同じ構造の新しいインスタンスを作成するためにのみ使用できます。どのようなシナリオで使用するのか、変更可能なインスタンスのフィールドを直接変更することはできないのか、変更可能なインスタンスを作成せずにマージ操作を行う必要があるのか、immutability?
let user2 = User {
age: 19,
..user1
}
さらに、2 つの特殊な構造体定義があります。
// タプル構造体
struct Color(i32, i32, i32);
// ユニット構造体
struct Something;
理解#
- タプルよりも複合値に対して読みやすい識別子を提供します。TS でもタプルの概念があり、有限の長さを持つ配列です。配列は数字のインデックスをキーとする特殊なオブジェクトであり、一部のシナリオではオブジェクトの代わりに使用できますが、指定されたキーはフィールドの意味をより理解しやすくします。
- 値の集まりを抽象的な存在として扱い、その集まりに対してメソッドや関連関数を実装できます。
メソッドと関連関数#
構造体に関連付けられた [[関数]] を実装することができます。これは関連関数と呼ばれ、JS のクラスの静的メソッドに似ています。関連関数の最初のパラメータが self
を使用してインスタンスのコンテキストを取得する場合、メソッドと呼ばれます。
impl User {
// 関連関数
fn new() -> Self {
Self {
name: String::from(""),
age: 1,
}
}
// インスタンスメソッド
fn get_name(&self) -> &str {
&self.name
}
// インスタンスの可変メソッド
fn set_name(&mut self, name: String) {
self.name = name
}
}
メソッドの定義時、&self
は self: &Self
の省略形です。&
を省略して所有権を取得することもできます。