【发布时间】:2016-11-01 05:42:43
【问题描述】:
我知道这在 Rust 中是非法的:
trait A { }
struct S { a: A, b: A }
原因是除了最后一个之外的所有成员都必须调整大小,而一个特征没有调整大小。
这是否意味着不可能拥有特征结构/元组?我如何从一个函数返回一对值,而我只知道它们实现了某个特征?
【问题讨论】:
我知道这在 Rust 中是非法的:
trait A { }
struct S { a: A, b: A }
原因是除了最后一个之外的所有成员都必须调整大小,而一个特征没有调整大小。
这是否意味着不可能拥有特征结构/元组?我如何从一个函数返回一对值,而我只知道它们实现了某个特征?
【问题讨论】:
你已经发现了type没有size的问题,所以你只需要把它变成sized type。
如果您不拥有这些对象,则可以使用参考。
struct S1<'a> {
a: &'a A,
b: &'a A,
}
如果它们不同,您可以使用两个生命周期而不是一个生命周期。
struct S1<'a, 'b> {
a: &'a A,
b: &'b A,
}
如果你想拥有这些对象,你可以使用Box。
struct S2 {
a: Box<A>,
b: Box<A>,
}
另外,如果你在编译时就知道具体的类型,而你只想写泛型代码,你也可以写泛型结构
struct S3<A1: A, A2: A> {
a: A1,
b: A2,
}
在S3 中,每个A1 或A2 代表一个具体类型,当您在代码中实例化它时,它实现了特征A。
【讨论】:
A1 和 A2 将是实例化时的实际类型,尽管 trait A 不是。当您在代码中使用泛型结构时,您必须指定类型 A1 和 A2。这就是编译器如何(以及何时)知道你的类型的大小,因为你从字面上告诉编译器这些类型到底是什么。
trait T { fn func(&self, x: &Self) -> (Self, Self); }。 trait 中的单个函数接受另一个相同类型的对象,并返回另外两个相同类型的对象。
Self 是一个大小的类型,以便它可以在一个元组中使用,你只需要在你的 trait 声明中声明 T 为 std::marker::Sized。这是一个例子:play.rust-lang.org/…