【问题标题】:Simulating field inheritence with composition使用组合模拟字段继承
【发布时间】:2017-12-12 01:28:05
【问题描述】:

我有几对结构,其中一个的字段是另一个的完美超集。我想模拟某种继承,这样我就不必为每个结构设置单独的案例,因为这几乎会使我的代码翻倍。

在像 C 这样的语言中,我可以用这样的方式模拟字段的继承:

struct A
{
    int a;
};

struct B
{
    struct A parent;
    int b;
};

main()
{
    struct B test1;
    struct A *test2 = &test1;
    test2->a = 7;
}

我想在 Rust 中做这样的事情。我读到了类似here 的东西,但是当我尝试它时,它似乎还没有实现。有没有办法在不单独处理案例的情况下重用一个结构中的字段?

这是我尝试过的枚举语法:

enum Top
{
    a: i32,
    A {},
    B {
        b: i32
    }
}

这是我的错误:

error: expected one of `(`, `,`, `=`, `{`, or `}`, found `:`
 --> src/main.rs:3:6
  |
3 |     a: i32,
  |      ^ expected one of `(`, `,`, `=`, `{`, or `}` here

Link 执行一些示例。

【问题讨论】:

  • 当我尝试过时,它似乎还没有实现”愿意分享你的尝试吗?你遇到的错误?把它放在play.rust-lang.org 上,这样其他人也可以运行它。

标签: inheritance struct enums rust composition


【解决方案1】:

从 Rust 1.22 开始,枚举中公共字段的建议语法尚未实现。现在唯一的选择是普通的旧构图。如果您希望能够对包含A 的多种类型进行通用操作,您可以定义一个特征来提供对该A 的访问并在所有这些类型上实现它:

trait HaveA {
    fn a(&self) -> &A;
    fn a_mut(&mut self) -> &mut A;
}

impl HaveA for B {
    fn a(&self) -> &A {
        &self.parent
    }

    fn a_mut(&mut self) -> &mut A {
        &mut self.parent
    }
}

【讨论】:

  • 我投了赞成票,因为它可以解决问题,但我坚持选择它作为解决方案,因为似乎应该有更好的方法。我想我期待对系统编程语言进行更严格的控制。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-07-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-03
相关资源
最近更新 更多