我有以下代码:
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>
}
大于'b
和according to the documentation:
您不会经常需要这种语法,但它可能出现在各种情况中 喜欢这个,你需要引用你拥有的东西 参考。
我觉得这也是一个糟糕的选择,因为这里的例子非常简单,可能并不需要这种高级功能。
如何决定是否应该使用引用或框?
答案 0 :(得分:4)
不幸的是,您使用的引用适用于完全不同的情况。
实际上,
Box<T>
仅对递归数据结构有用(因此可以表示它们而不是无限大小)以及对大型类型的非常偶然的性能优化(你不应该尝试测量)。
正在谈论使用MyEnum
或Box<MyEnum>
作为数据成员:
所以...重置你的大脑,让我们再次从头开始。
Box
与参考之间的主要区别是所有权:
Box
表示周围的struct 拥有数据, Rc
(以及Arc
)可以在一定程度上减轻决策的需要,因为它们允许多个所有者,但是它们也会引入参考周期的风险,这是调试自己的噩梦所以我要提醒过度使用它们。