gpt4 book ai didi

struct - 我如何声明我想要一个包含对实现特征的东西的引用的结构?

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

Editor's note: The code presented in the question compiles as-is in Rust 1.0.

我试过:

trait Inner {}

struct Outer<'a> {
inner: &'a Inner,
}

但是编译器提示:

   Compiling tst v0.1.0 (file:///home/chris/rust/tst)
/home/chris/rust/tst/src/main.rs:4:14: 4:19 error: explicit lifetime bound required
/home/chris/rust/tst/src/main.rs:4 inner: &'a Inner,

最佳答案

How do I tell Rust that I want a struct which contains a reference to something which implements a trait?

有两种方法。首先,首选的是使用泛型:

struct Outer<'a, T> {
inner: &'a T,
}

impl<'a, T: Inner> Outer<'a, T> {
// ...
}

此方法是最有效的,因为所有函数调用都是静态调度的。它也是类型安全性最高的一个,但它的缺点是您必须在使用 Outer<T> 的任何地方指定特征绑定(bind)。你将无法持有 Inner 的不同实现在不同时间的相同结构中,因为 T必须事先知道。

另一种方法是使用特征对象:

struct Outer<'a> {
inner: &'a (Inner + 'a),
}

这是您已经尝试过的方法,您看到的错误是由于未指定生命周期限制引起的:+ 'a事物。您需要指定生命周期边界,因为可以为具有生命周期参数的结构(如 Outer )实现特征,如果将这样的结构装入特征对象,则需要一种方法在特征对象类型中指定其生命周期参数。

特征对象的优点是注释量较少,并且能够使用任意类型作为 inner相同的领域Outer值,只要它满足 Inner边界。缺点是您将获得动态调度,这可能效率稍低。如果没有额外的机制,您也无法取回特征对象的原始类型。

关于struct - 我如何声明我想要一个包含对实现特征的东西的引用的结构?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26364310/

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