何时使用引用或框来获得在结构中实现特征的字段?

时间:2017-09-18 20:36:52

标签: struct reference rust traits

我有以下代码:

WITH husbands as (      
    SELECT  ROW_NUMBER() OVER (ORDER BY R1.[FromID]) as [familyID],
            R1.[FromID] as [ID]           
    FROM [Relations] R1
    LEFT JOIN [Relations] R2
      ON R1.[FromID] = R2.[ToID]
    WHERE R2.[FromID] IS NULL
), wifes as (
    SELECT H.[familyID], R1.[ToID] as [ID]
    FROM husbands H
    JOIN Relations R1
      ON H.[ID] = R1.[FromID] 
), childrens as (
    SELECT H.[familyID], R2.[ToID] as [ID]
    FROM husbands H
    JOIN Relations R1
      ON H.[ID] = R1.[FromID] 
    JOIN Relations R2
      ON R1.[ToID] = R2.[FromID]     
)    
SELECT * FROM husbands UNION 
SELECT * FROM wifes UNION 
SELECT * FROM childrens

如果我希望结构pub trait MyTrait { pub fn do_something(&self); } 具有实现特征A的字段a,则有2个选项:

MyTrait

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

但在Difference between pass by reference and by box,有人说:

  

实际上,pub struct A { a: Box<MyTrait> } 仅对递归数据结构有用(所以   他们可以代表而不是无限大小)和   大型的非常偶然的性能优化(你   不应该尝试没有测量)。

除非Box<T>实现A,否则我说MyTrait不是递归数据结构,因此我认为我应该更喜欢使用引用而不是框。

如果我有另一个结构A,它引用了某个B对象,就像这样:

A

我需要说pub struct A<'a> { a: &'a MyTrait } pub struct B<'a, 'b: 'a> { b: &'a A<'b> } 大于'baccording to the documentation

  

您不会经常需要这种语法,但它可能出现在各种情况中   喜欢这个,你需要引用你拥有的东西   参考。

我觉得这也是一个糟糕的选择,因为这里的例子非常简单,可能并不需要这种高级功能。

如何决定是否应该使用引用或框?

1 个答案:

答案 0 :(得分:4)

不幸的是,您使用的引用适用于完全不同的情况。

  

实际上,Box<T>仅对递归数据结构有用(因此可以表示它们而不是无限大小)以及对大型类型的非常偶然的性能优化(你不应该尝试测量)。

正在谈论使用MyEnumBox<MyEnum>作为数据成员:

  • 不与参考文献比较,
  • 它不是在谈论特质。

所以...重置你的大脑,让我们再次从头开始。

Box与参考之间的主要区别是所有权

  • Box表示周围的struct 拥有数据,
  • 引用表示周围的struct 借用数据。
因此,它们的使用取决于你是想要所有权还是借用,这是一种情境决定:既不比另一种更好,就像螺丝刀和锤子不比另一种更好。

Rc(以及Arc)可以在一定程度上减轻决策的需要,因为它们允许多个所有者,但是它们也会引入参考周期的风险,这是调试自己的噩梦所以我要提醒过度使用它们。