- 648 名前:デフォルトの名無しさん mailto:sage [2022/01/20(木) 13:18:31.58 ID:hnvUf8sg.net]
- >>631
中身を書き換えられる『セル』という分かりやすい名前 Cellは内部可変がOK RefCellは内部可変参照がOK 違いが分かりやすいように3種類を持つ構造体を用意 struct S { a: [i32; 3], c: Cell<[i32; 3]>, r: RefCell<[i32; 3]>, } let s = S { a: [1, 2, 3], c: Cell::new([1, 2, 3]), r: RefCell::new([1, 2, 3]), }; // s.a = [4, 5, 6]; // コンパイルエラー (sがmutじゃないため) // s.a[1] = 5; // コンパイルエラー (sがmutじゃないため) s.c.set([4, 5, 6]); // OK 内部可変 { let mut p = s.r.borrow_mut(); // OK 内部可変参照 p[1] = 5; // このブロックを抜けるとborrow自動返却 } assert_eq!([1, 2, 3], s.a); assert_eq!([4, 5, 6], s.c.get()); assert_eq!([1, 5, 3], *s.r.borrow());
|

|