![](/img/trans.png)
[英]How do I state that I want a struct which contains a reference to something which implements a trait?
[英]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>
僅適用於遞歸數據結構(以便可以表示它們而不是無限大小),並且偶爾用於大型類型的性能優化(您不應該嘗試不進行測量)。
談論使用MyEnum
或Box<MyEnum>
作為數據成員:
所以...重置您的大腦,讓我們從頭開始。
Box
和參考之間的主要區別是所有權 :
Box
表示周圍的結構擁有該數據塊, 因此,它們的使用取決於您是要所有權還是要借用,這是一個情況決定:與螺絲起子和錘子都不比另一個要好。
Rc
(和Arc
)可以允許多個所有者,因此在某種程度上可以減輕決策的需要,但是它們也引入了參考循環的風險,這是調試自身的噩夢,因此,我會警告過度使用它們。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.