MoonBit每周工作动态——0129

MoonBit更新

1. 新增特性Trait object:

能够显式地将类型不同但实现相同trait的值装箱并表示成同一个类型,实现函数的动态分发。

fn get_show_list() -> List[Show] {
  let a = 42 as Show
  let b = "xxx" as Show
  let c = 3.14 as Show
  List::Cons(a, Cons(b, Cons(c, Nil)))
}

fn init {
  fn print_show_list {
    List::Cons(a, rest) => { println(a); print_show_list(rest) }
    List::Nil => ()
  }
  print_show_list(get_show_list())
}

2. 新增管道运算符

提供类似于链式调用的语法,可以串联多个连续的函数调用,省去let name = ...的代码。例如value |> func1(arg1,arg2) |> func2 相当于:

let a = value
let b = func1(a, arg1, arg2) 
func2(b)

另一个例子:

fn sub2(x : Int, y : Int) -> Int {
  x - y
}

fn sum3(x : Int, y : Int, z : Int) -> Int {
  x + y + z
}

fn init {
  6 |> sub2(5) |> sum3(1,2) |> println()
}

3. 字符串支持使用\xFF进行十六进制转义

fn init {
  let data = "\x48\x65\x6c\x6c\x6f"
  println(data) //output: Hello
}

4. Inline test变更

现在test mode也会执行fn init,执行顺序在inline test之前。

5. Moonfmt:改进类型和长数组字面量的缩进

原代码:

改进前的格式化效果:

改进后的格式化效果:

pipe 会支持占位符吗?

会的,这个还在计划中。