# 结构体

> 

`struct` 是 Dujie 的具名名义类型。

## 定义

结构体只支持具名字段：

```dj
struct User {
    name: string,
    age: int,
}
```

规则：

- 字段声明写作 `name: Type`
- 不支持匿名成员结构体
- 不支持 tuple struct
- 不支持按数字索引访问
- 第一阶段不支持字段默认值

## 构造

使用具名构造：

```dj
let user = User {
    name: "Alice",
    age: 30,
};
```

规则：

- 所有字段必须显式提供
- 未知字段是编译错误
- 重复字段是编译错误
- 缺字段是编译错误

## 访问与更新

字段访问使用点操作：

```dj
let name = user.name;
```

字段更新要求目标来自 `var` 绑定：

```dj
var user = User {
    name: "Alice",
    age: 30,
};

user.name = "Bob";
```

如果字段不存在，是编译错误。

## 名义类型

结构体采用名义类型规则。

```dj
struct User {
    name: string,
}

struct Author {
    name: string,
}
```

这里 `User` 和 `Author` 不是同一类型，即使字段完全相同。

## 泛型结构体

结构体可以带类型参数：

```dj
struct Box<T> {
    value: T,
}
```

构造时允许从字段值局部推导类型参数：

```dj
let a = Box { value: "x" };  // Box<string>
```

## 递归

允许通过 `opt<T>`、`list<T>`、`map<K, T>` 间接递归：

```dj
struct Node {
    next: opt<Node>,
}
```

不允许字段直接按值引用自身类型。
