# 类型与数据

Kelyra 把类型写在名称之后：`name: Type`。局部变量也可以从初始值推导类型。

## 内置类型

| 类别 | 类型 |
| --- | --- |
| 有符号整数 | `i8`、`i16`、`i32`、`i64`、`i128`、`isize` |
| 无符号整数 | `u8`、`u16`、`u32`、`u64`、`u128`、`usize` |
| 浮点数 | `f32`、`f64`；`f128` 等更宽类型的支持范围有限 |
| 其他 | `bool`、`char` |

`isize` 和 `usize` 随目标平台指针宽度变化。`char` 表示 Unicode 标量值。`f256` 和 `f512` 目前只能用于部分签名场景，不能用于普通字面量或算术。

## 数组、切片与指针

定长数组写作 `[4]i32`，切片写作 `[]i32`，只读切片写作 `[]const i32`。原始指针写作 `*i32`。

```kelyra
fn first(values: []const i32) -> i32 {
  return values[0];
}
```

切片由地址和长度组成，可用 `.len` 读取长度。切片索引与范围会做边界检查。原始指针可用 `&` 取地址、`*` 解引用；编译器目前不进行借用或生命周期检查。

完整切片示例来自编译器测试：

```kelyra
fn sum(values: []const i32) -> i32 {
  let total: i32 = 0;
  let i: usize = 0;
  while i < values.len {
    total = total + values[i];
    i = i + 1;
  }
  return total;
}

fn update(values: []i32) {
  values[0] = 10;
}

@main
fn main() -> i32 {
  let values: [4]i32;
  values[0] = 1;
  values[1] = 2;
  values[2] = 3;
  values[3] = 4;
  let middle: []i32 = values[1: 3];
  update(middle);
  let first: []const i32 = values[: 2];
  let last: []const i32 = values[2:];
  let all: []const i32 = values[:];
  if middle.len != 2 || first.len != 2 || last.len != 2 || all.len != 4 {
    return 1;
  }
  if sum(all) != 18 || sum(middle[: 1]) != 10 {
    return 2;
  }
  return 0;
}
```
## 类型别名与泛型类

`alias` 定义透明类型别名；类可以带类型参数。

```kelyra
alias Count = i32;

class Box<T> {
  value: T;
  pub init(value: T) { this.value = value; }
}
```

别名与目标类型可以直接互用。泛型能力还在扩展，同名泛型函数模板目前不能重载。
