MoonBit 语言导览 MoonBit

泛型与函数

泛型允许你为多种不同类型编写同一套代码,而无需重复相似的逻辑。

示例中给Array[Int]Array[Bool]分别定义了swap_intswap_bool函数,假如我们还要 交换Array[String]Array[Char]中的元素,就不得不再写两个类似的函数!要是类型也可以像函 数参数一样,由调用者决定并传入就好了。

MoonBit 提供了泛型来实现这个功能, 泛型参数使用[]包裹,可以定义多个泛型参数。对于函数来说, 泛型参数写在关键字fn后。示例中函数swap定义了一个泛型参数TT在整个函数定义里使用了两次:

  • 作为参数arr的元素类型:arr : Array[T]
  • 作为局部变量tmp的类型:let tmp : T = arr[0]

这样,数组中的元素和tmp变量就拥有了相同的类型T,而T是什么类型由调用者决定。在main中 调用时,类型推导能够从传入的参数array推导出泛型参数T的具体类型,因此不需要显式地传入类型参数。

显示指定泛型参数类型

在大部分函数调用的场景,类型推导都能够推出泛型参数类型,因此 MoonBit 没有类似于其他语言中显式传入 泛型参数类型的语法。如果希望显示指定,可以通过增加额外的类型注解来实现,例如:

swap((arr : Array[Int]))

或者

let arr : Array[Int] = [1, 2]
swap(arr)
///|
/// swap two int in array
fn swap_int(arr : Array[Int]) -> Unit {
  let tmp : Int = arr[0]
  arr[0] = arr[1]
  arr[1] = tmp
}

///|
/// swap two bool in array
fn swap_bool(arr : Array[Bool]) -> Unit {
  let tmp : Bool = arr[0]
  arr[0] = arr[1]
  arr[1] = tmp
}

///|
/// generic swap
fn[T] swap(arr : Array[T]) -> Unit {
  let tmp : T = arr[0]
  arr[0] = arr[1]
  arr[1] = tmp
}

///|
fn main {
  // swap ints
  let array1 = [1, 2]
  swap_int(array1)
  println(array1)

  // swap bools
  let array2 = [true, false]
  swap_bool(array2)
  println(array2)

  // generic swap
  swap(array1)
  swap(array2)
  println(array1)
  println(array2)
}