Rust是否支持嵌套结构体?

64

当我尝试在另一个结构体内声明一个结构体时:

struct Test {
    struct Foo {}
}
编译器报错:
error: expected identifier, found keyword `struct`
 --> src/lib.rs:2:5
  |
2 |     struct Foo {}
  |     ^^^^^^ expected identifier, found keyword
help: you can escape reserved keywords to use them as identifiers
  |
2 |     r#struct Foo {}
  |     ^^^^^^^^

error: expected `:`, found `Foo`
 --> src/lib.rs:2:12
  |
2 |     struct Foo {}
  |            ^^^ expected `:`

我找不到任何相关的文档,嵌套结构体在Rust中是否受支持?


1
这并不是一个严格的答案,但元组可以在结构体内定义,具有一些类似的功能。虽然这是一个旧问题,但我认为这些信息可能仍然相关。 - user8866053
3个回答

64

不支持使用嵌套结构体声明。您应该使用单独的结构体声明和常规字段:

struct Foo {}

struct Test {
    foo: Foo,
}

18
嵌套结构体可以方便地展示结构体的可见性。因此,Rust 是少数不支持嵌套的编程语言之一。 - abergmeier
14
@abergmeier,Rust 的可见性单位是模块。你应该使用经过仔细构建的模块层次结构来限制结构体等内容的可见性。另外,据我所知,你可以在函数内定义函数(这个是确定的),以及结构体和特质(需要验证)。 - Vladimir Matveev
谢谢。我会看看通过模块进行结构化是否能解决我的可见性问题。 - abergmeier

2

我找到了你请求的可选答案。也许它可以帮助你: https://internals.rust-lang.org/t/nested-struct-declaration/13314/4

结构记录 592 可以给你嵌套(不包括隐私控制或命名)。

// From the RFC
struct RectangleTidy {
    dimensions: {
        width: u64,
        height: u64,
    },
    color: {
        red: u8,
        green: u8,
        blue: u8,
    },
}

以下是我的旧答案,请忽略。
使用稳定版本构建:1.65.0。 这里有一个例子给你。 rust playground 代码:
#[derive(Debug)]
struct Inner {
    i: i32,
}

#[derive(Debug)]
struct Outer {
    o: i32,
    inner: Inner,
}

pub fn test() {
    // add your code here
    let obj = Outer {
        o: 10,
        inner: Inner { i: 9 },
    };
    assert!(10i32 == obj.o);
    assert!(9i32 == obj.inner.i);
    println!("{}", obj.o);
    println!("{}", obj.inner.i);
    println!("{:?}", obj);
}
fn main() {
    test();
}

OP 问是否可以在另一个结构体内定义一个结构体,而不是如何声明具有结构体类型的属性。 - klefevre
@klefevre 你说得对。谢谢提醒。我在这里犯了一个错误。 - Church Zhong

0

它们在Rust中不受支持。

但是您可以自己编写一个过程宏来模拟它们。我 已经有了, 它变成

structstruck::strike!{
    struct Test {
        foo: struct {}
    }
}

进入

struct Foo {}
struct Test {
    foo: Foo,
}

你并没有明确说明,但我猜测你使用嵌套结构体的目的不是为了更容易阅读的数据结构声明,而是为了命名空间? 实际上,你不能将一个结构体命名为Test并将Foo作为Test::Foo访问,但你可以编写一个过程宏,至少自动创建一个mod test { Foo {} }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接