簡體   English   中英

何時使用引用或框包含在結構中實現特征的字段?

[英]When to use a reference or a box to have a field that implements a trait in a struct?

我有以下代碼:

pub trait MyTrait {
    pub fn do_something(&self);
}

如果我希望結構A具有實現特征MyTrait的字段a ,則有2個選項:

pub struct A<'a> {
    a: &'a MyTrait
}

要么

pub struct A {
    a: Box<MyTrait>
}

但是, 在按引用傳遞和按框傳遞之間的區別上 ,有人說:

實際上, Box<T>僅適用於遞歸數據結構(以便可以表示它們而不是無限大小),並且偶爾用於大型類型的性能優化(您不應該嘗試不進行測量)。

除非A實現MyTrait ,否則我會說A不是遞歸數據結構,因此我認為我應該更喜歡使用引用而不是框。

如果我有另一個對某個A對象的引用的結構B ,如下所示:

pub struct A<'a> {
    a: &'a MyTrait
}

pub struct B<'a, 'b: 'a> {
    b: &'a A<'b>
}

我需要說'b大於'a ,並且根據文檔

您不會經常需要這種語法,但是在像這樣的情況下,您需要引用自己所引用的內容時就會出現這種語法。

我覺得這也是一個不好的選擇,因為這里的示例確實很簡單,可能不需要這種高級功能。

如何決定該使用參考還是框呢?

不幸的是,您使用的報價適用於完全不同的情況。

實際上, Box<T>僅適用於遞歸數據結構(以便可以表示它們而不是無限大小),並且偶爾用於大型類型的性能優化(您不應該嘗試不進行測量)。

談論使用MyEnumBox<MyEnum>作為數據成員:

  • 它沒有與參考進行比較,
  • 它不是在談論特質。

所以...重置您的大腦,讓我們從頭開始。


Box和參考之間的主要區別是所有權

  • Box表示周圍的結構擁有該數據塊,
  • 引用表明周圍的結構借用了該數據。

因此,它們的使用取決於您是要所有權還是要借用,這是一個情況決定:與螺絲起子和錘子都不比另一個要好。

Rc (和Arc )可以允許多個所有者,因此在某種程度上可以減輕決策的需要,但是它們也引入了參考循環的風險,這是調試自身的噩夢,因此,我會警告過度使用它們。

暫無
暫無

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

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