gpt4 book ai didi

rust - 实现可在不同类型的所有权 : &'a T, 或 Box 或 A : T? 上重用的通用代码的最佳实践是什么

转载 作者:行者123 更新时间:2023-11-29 08:07:35 24 4
gpt4 key购买 nike

我有一个特质 T。我正在实现一个结构 S,它拥有或保留对实现特征 T 的对象的引用。可以通过以下几种方式之一完成:

  1. struct S<A: T> {
    field: A,
    }
  2. struct S<A: T, 'a> {
    field: &'a A,
    }
  3. struct S<'a> {
    field: &'a T,
    }
  4. struct S {
    field: Box<T>,
    }

...等等。

在不同的情况下,不同的所有权模型可能会有用。

我想以这样一种方式实现S,它可以通过以下任何一种方式创建:

trait T { }
struct A { }
impl T for A { }

fn main() {
let a = A {};
let s1 = S::new_owning(a);
let s2 = S::new_from_ref(&a);
let s3 = S::new_from_trait_ref(&a as &T);
let s4 = S::new_from_boxed_trait(Box::new(a));
}

最佳答案

这可能有点依赖于大小写,但在可能的情况下,您应该更喜欢直接获取值(例如,一些 T: Trait)。

有一个类似的 API 指南 ( C-RW-VALUE ),它建议接口(interface)直接采​​用参数 T,而不是对实现 std::io 的值的可变引用: :Readstd::io::Write。这是有效的,因为 ReadWrite 也实现了对实现这些特征的任意 T 类型的可变引用。

如果您可以控制该特征,则遵循相同的方法是非常惯用的,并且无需那么多构造函数即可解决您的问题。

trait T { }
// generic implementations for references and smart container types follow
impl<'a, U: ?Sized + T> T for &'a U { }
impl<U: ?Sized + T> T for Box<U> { }

struct A { }
impl T for A { }

fn main() {
let a = A {};
let s1 = S::new(a);
let s2 = S::new(&a);
let s3 = S::new(&a as &T);
let s4 = S::new(Box::new(a));
}

另见:

关于rust - 实现可在不同类型的所有权 : &'a T, 或 Box<T> 或 A : T? 上重用的通用代码的最佳实践是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50256435/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com