Skip to content
本文 下载 Markdown

类型与数据 ​

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; }
}

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

认真写代码,也认真写说明。