# 泛型

> 

Dujie 当前提供一套简单泛型系统。

## 支持范围

第一阶段泛型只允许出现在：

- 顶层 `func`
- 顶层 `struct`

## 泛型函数

```dj
func id<T>(x: T) -> T {
    x
}
```

函数调用时优先从普通实参推导类型参数：

```dj
id(1)
id<string>("hello")
```

## 泛型结构体

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

类型位置需要显式写出类型实参：

```dj
let a: Box<string>
```

构造时如果字段值足以唯一推导类型参数，可以直接写：

```dj
let x = Box { value: "hello" }
```

## 当前约束

当前唯一内建约束是 `key`：

```dj
func has_key<K: key, V>(m: map<K, V>, k: K) -> bool {
    m.contains(k)
}
```

满足 `key` 的类型目前只有：

- `int`
- `bool`
- `rune`
- `string`

## 当前不支持

- 用户自定义方法泛型
- 通用 `comparable` 约束
- `where` 子句
- 用户自定义约束
