【问题标题】:Possible to have a struct/tuple of traits in Rust?可能在 Rust 中有一个结构/特征元组?
【发布时间】:2016-11-01 05:42:43
【问题描述】:

我知道这在 Rust 中是非法的:

trait A { }
struct S { a: A, b: A }

原因是除了最后一个之外的所有成员都必须调整大小,而一个特征没有调整大小。

这是否意味着不可能拥有特征结构/元组?我如何从一个函数返回一对值,而我只知道它们实现了某个特征?

【问题讨论】:

    标签: struct rust traits


    【解决方案1】:

    你已经发现了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 中,每个A1A2 代表一个具体类型,当您在代码中实例化它时,它实现了特征A

    【讨论】:

    • 谢谢。我认为 S3 是我正在寻找的,但是该声明如何使结构调整大小以使编译器不会抱怨?
    • @rityzmon,这是因为 A1A2 将是实例化时的实际类型,尽管 trait A 不是。当您在代码中使用泛型结构时,您必须指定类型 A1A2。这就是编译器如何(以及何时)知道你的类型的大小,因为你从字面上告诉编译器这些类型到底是什么。
    • 谢谢。如果我想从函数返回一个特征元组,我将如何使用相同的技术?我试图弄清楚的一个具体问题是trait T { fn func(&amp;self, x: &amp;Self) -&gt; (Self, Self); }。 trait 中的单个函数接受另一个相同类型的对象,并返回另外两个相同类型的对象。
    • @rityzmon,因为你需要 Self 是一个大小的类型,以便它可以在一个元组中使用,你只需要在你的 trait 声明中声明 Tstd::marker::Sized。这是一个例子:play.rust-lang.org/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-09
    • 1970-01-01
    • 1970-01-01
    • 2022-11-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多