簡體   English   中英

如何使用內部引用構建結構?

[英]How can I make a structure with internal references?

我正在嘗試使用鄰接列表創建一個圖形,但我無法弄清楚如何為鄰接列表中的引用指定適當的生命周期。

我想要得到的是以下內容:

struct Graph<T> {
    nodes : Vec<T>,
    adjacencies : Vec<Vec<&T>>
}

這不起作用,因為引用類型缺少生命周期說明符。 我想我可以使用索引作為鄰接,但我實際上對內部參考問題感興趣,這只是表達這個問題的工具。

我看到它的方式,應該可以安全地進行,因為節點是由對象擁有的。 應該允許它保持對這些節點的引用。

我對嗎? 怎么能在Rust做到這一點? 或者,如果我錯了,我錯過了什么?

由於Rust的內存安全性而無法在Rust中使用引用來表示此概念 - 這樣的對象在沒有已存在的情況下無法構建。 只要nodesadjacencies是分開存儲的,就可以了,但只要你嘗試將它們連接在同一個結構中,它就無法工作。

替代方案是使用引用計數(如果不可變是Rc<T>或具有內部可變性的Rc<RefCell<T>> )或使用不安全指針( *const T*mut T )。

我認為這里有一個問題。 如果我們將它轉​​換為C ++:

template <typename T>
struct Graph {
    std::vector<T> nodes;
    std::vector<std::vector<T*>> adjacencies;
};

adjacencies點指向nodes ,然后人們意識到存在一個問題: nodes上的操作使引用無效(例如重新分配)會將懸空指針留給adjacencies

我看到至少有兩種方法可以解決這個問題:

  • 使用adjacencies索引,因為它們是穩定的
  • nodes使用一個間接級別,以便固定內存

在Rust中,這給出了:

struct Graph<T> {
    nodes: Vec<T>,
    adjacencies: Vec<Vec<uint>>,
};

struct Graph<T> {
    nodes: Vec<Rc<RefCell<T>>>,
    adjacencies: Vec<Vec<Rc<RefCell<T>>>>,
};

注意: RefCell允許通過引入運行時檢查來改變T盡管它是別名。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM