← SEARCHABLE ARCHIVE
Rust · 2026-08-08

Rust 從基礎到精通 — 第 8 講

透過 Box、Rc、Arc 選擇您的所有權結構

INTERACTIVE READING MODE →

該部落格上撰寫的文章是出於教學目的而創建的。 另外,文章中的資訊可能不正確,請謹慎。

大多數值只能由局部變數和集合擁有。 當您需要堅持堆疊或在多個所有者之間共享時,請選擇適合您目的的智慧指標。

Box

enum Node {
    Value(i32, Box<Node>),
    End,
}

let list = Node::Value(
    10,
    Box::new(Node::Value(20, Box::new(Node::End))),
);

對於遞歸類型,在編譯時無法立即知道下一個值的大小。 Box 將值放置在堆疊上,並以目前類型儲存固定大小的指標。

Box 不會自動分享,而且仍然只有一個主要所有者。

RC 和 Arc

use std::rc::Rc;

let data = Rc::new(String::from("ItemTable"));
let ui_data = Rc::clone(&data);
let game_data = Rc::clone(&data);

rc 允許多個地方在單一執行緒中擁有相同的值。 當最後一個Rc消失時,這些值會被清除。

跨多個執行緒共享需要 Arc,它使用原子引用計數。 Rc和Arc預設不會使其內部值可變。

內部變異性

use std::cell::RefCell;
use std::rc::Rc;

let score = Rc::new(RefCell::new(0));
*score.borrow_mut() += 10;

RefCell 在執行時期而不是編譯時檢查借用規則。 同時,如果借用不正確,程式會發生恐慌,因此編譯檢查不會消失。

通常使用 Arc 和 Mutex 的組合在執行緒之間同步變更存取。

如果重疊很多智慧指針,就很難理解所有權結構。 首先要檢查Box擁有堆、Rc與單線程共享、Arc在線程間共享的目的,並選擇最簡單的類型。