其他
MoonBit本周亮点:trait 支持默认实现(实验性)
-- 更新目录 --
1/ 实验性功能:给trait实现默认方法
2/ 允许类型定义的类型参数为‘
_’
3/ 现在Toplevel函数没有标记返回值的行为会报错
4/ 添加按位取反的操作符
5/ 支持对moonbitlang/core的补全
01语言更新
trait MyShow {
repr(Self) -> String
str (Self) -> String // it has a default implementation
}
impl MyShow::str(self : Self) -> String {
// default implementation of str
self.repr()
}
type MyInt Int
fn repr(self:MyInt) -> String {
self.0.to_string()
}
// Now MyInt implements MyShow now
2. 允许类型定义的类型参数为 _
_
可以用来定义 phantom type,来限制一些程序逻辑上非法的操作。例如我们希望不同单位的长度不能够相加:
type Length[_] Int
type Kilometer
type Mile
fn add[T](x: Length[T], y:Length[T]) -> Length[T] {
Length::Length(x.0 + y.0)
}
let d_km: Length[Kilometer] = Length(10)
let d_mile: Length[Mile] = Length(16)
此时,两个单位不同的长度并不能够直接相加:
fn init {
add(d_km, d_mile) |> ignore
// ^~~~~~ Error: Expr Type Mismatch
}
而两个单位相同的长度可以相加:
fn init {
add(d_km, d_km) |> ignore
// OK
}
3. 现在 Toplevel 函数没有标记返回值的行为改成报错
Toplevel 函数没有标记返回值的行为从之前的默认设置为 Unit 改成报错。
fn print_hello() {
// ^~~~~~~~~~~ Error:
// Missing type annotation for the return value.
println("Hello!")
}
fn main {
println((1).lnot())
}
输出:
-2
5. 改进 List::to_string/debug_write 的输出
fn main {
let l = List::Cons(1, Cons(2, Cons(3, Nil)))
println(l)
}
输出:
List::[1, 2, 3]
6. 添加了 Byte 类型
byte 字面量由 b 作为前缀,使用方式如下:
fn init {
let b1 = b'a'
println(b1.to_int())
let b2 = b'\xff'
println(b2.to_int())
}
更多关于 Byte 的功能还在完善中
02IDE更新
2. 格式化的更新和修复:
调整空的 struct、enum、trait,避免出现空行。
之前:
struct A {
}
之后:
struct A {}
修复 continue 的错误缩进。
修复多行语句格式化后出现分号的问题。
03构建系统更新
1. moon.mod.json 添加了 test_import 字段
test_import
这个字段中用到的依赖只会在测试的时候被用到。
2. 优化 moon test 输出
moon test -v
命令。MoonBit
Twitter丨@MoonbitlangBilibili丨MoonBit月兔MoonBit用户交流群|添加小助手moonbit_helper
⬇点击阅读原文
下载 MoonBit,开启 MoonBit 语言新体验