# 参数与默认值

> 

## `opt<T>` 参数

参数的可选性统一用 `opt<T>` 表达：

```dj
func hello(name: opt<string>) -> string {
    if name is some(v) {
        `hello ${v}`
    } else {
        "hello"
    }
}
```

这些调用都合法：

```dj
hello()
hello("Alice")
hello(some("Alice"))
hello(none)
```

## 默认值

默认值必须是编译期可确定表达式：

```dj
func repeat(text: string, count: int = 1) -> string {
    text
}
```

规则：

- 默认值不允许依赖前面的参数
- 默认值能唯一推导类型时，参数类型可以省略
- `= none` 这类情况必须显式写出 `opt<T>` 类型

## 位置参数中的省略

尾部参数可以省略的情况：

- 参数类型是 `opt<T>`
- 参数带默认值

## 具名参数中的省略

具名参数函数中：

- 未给默认值的非 `opt<T>` 参数必填
- `opt<T>` 参数可不传，不传时为 `none`
- 带默认值的参数可不传，不传时取默认值
- 未知参数和重复参数都是编译错误
