双周报Vol.73:移除使用方法实现 trait 、新增了 “错误多态” 功能、.语法支持使用 _ 的匿名函数...

语言更新

  • 调用带副作用的函数(抛出错误或异步)时的 ! 现在可以省略,IDE 的语义着色会自动给带错误的函数加上下划线,将异步函数标记为斜体

  • f?(..) 语法被替代为一个新语法 try? f(..)try? expr 等价于 try Ok(expr) catch { err => Err(err) },可以把错误转换为 Result 类型。相比原来的 f?(..)try? 具有更多的灵活性,它可以同时处理多处函数调用的错误,例如:

Rust 复制代码
try? {
  f(..)
  g(..)
}

在迁移时,需要特别注意一种情况:f?(g!(..)) 不能简单翻译为 try? f(g(..)),因为这会导致 g 中的错误被重定向到 Result 中。这种情况需要先用 letg 的结果提取出来,再使用 try?

  • 新增了 "错误多态" 功能,允许高阶函数同时处理带错误和不带错误的参数:
Rust 复制代码
fn[X] Array::each(arr : Array[X], f : (X) -> Unit?Error) -> Unit?Error {
  for x in arr {
    f(x)
  }
}

fn main {
  let arr = [ "a", "b", "c" ]
  arr.each(println) // 无错误
  println(try? arr.each(fail)) // 输出 Err(Failure)
}

错误多态的语法是 (..) -> T?Error,在调用时,?Error 可以被替换为任意错误类型,也可以被抹去,变成没有错误的情况。例如,在上面的 each 函数中,如果参数 f 没有错误,那么 ?Error 会被替换为 "没有错误",整个 each 函数的调用也不会抛出错误。如果 f 会抛出错误,那么 ?Error 会被替换为 f 实际的错误类型,整个 each 函数的调用也会抛出同样的错误

  • 之前,使用 fn meth(self : T) 形式定义的方法既是方法也是函数,可以用 meth(..)@pkg.meth(..) 的形式直接调用。这一 "将方法当作普通函数使用" 的行为将被废弃,目前编译器会对这一行为的使用提出警告。

    • 这一调整后,我们鼓励的 API 设计方式是:

    • 永远使用 fn T::meth(..) 的形式定义方法,新代码中不再使用 fn meth(self : T)(在以后,fn meth(self : T) 语法本身也可能被废弃)

      • 和某个类型绑定的 API 若无特殊理由,都鼓励设计成方法
  • . 语法支持使用 _ 的匿名函数,写法是 _.meth(..),同时,管道运算符 |> 的右手侧也支持了这种形式的匿名函数。注意使用这一语法时,必须能从上下文中得知 _ 的类型,否则无法解析方法。例子:

Rust 复制代码
fn main {
  let array_of_array = [ [], [ 1 ], [ 1, 2 ] ]
  let lens = array_of_array.map(_.length())
  lens |> _.each(println)
}

和直接写 x.meth(..) 相比,x |> _.meth(..) 的好处是,它可以把方法嵌入到一个现有的 |> 管线里,例如 x |> regular_func(..) |> _.meth(..)

  • fn TypeName::meth(..) 形式的方法声明中,可以使用 Self 来指代 TypeName,缩短类型签名的长度:
Rust 复制代码
type MyLongTypeName Int

fn MyLongTypeName::to_string(x : Self) -> String {
  x._.to_string()
}

如果 TypeName 有参数,使用 Self 时也需要提供参数

  • 使用方法实现 trait 的行为被正式移除
  • 函数的类型参数的位置从 fn f[..] 调整为 fn[..] f,从而和 impl 保持一致。这一改动可以使用格式化工具自动迁移
  • moon info 生成的 .mbti 文件中,方法的格式发生了变动。之前方法会被合并到一个大的 impl 块中,现在方法在 .mbti 中会被显示为一个扁平的列表,和 MoonBit 自身的语法保持一致
  • 异步函数的语法调整回了 async (..) -> T!Async 的语法由于和错误多态语法不兼容被废弃。这一改动可以使用格式化工具自动迁移
  • 增加了Float类型的字面量3.14F

标准库更新

  • CharShow::output 实现发生变更,现在对于所有不可打印字符会进行转译,包括 Control、Format、Surrogate、Private Use、Unassigned、Separator(除空格)等。

工具链更新

  • 单个 .mbt.md 文件支持外部依赖,用法如下:
Markdown 复制代码
---
moonbit:
  deps:
    moonbitlang/x: 0.4.23
    # moonbitlang/x:
    #   path: "/Users/flash/projects/x"  # local deps
  backend:
    js
---
相关推荐
It's now9 分钟前
Spring AI 基础开发流程
java·人工智能·后端·spring
计算机毕设VX:Fegn089512 分钟前
计算机毕业设计|基于springboot + vue图书商城系统(源码+数据库+文档)
java·数据库·vue.js·spring boot·后端·课程设计
yongui4783437 分钟前
MATLAB的指纹识别系统实现
算法
高山上有一只小老虎38 分钟前
翻之矩阵中的行
java·算法
jghhh011 小时前
RINEX文件进行卫星导航解算
算法
爱思德学术1 小时前
中国计算机学会(CCF)推荐学术会议-A(计算机科学理论):LICS 2026
算法·计算机理论·计算机逻辑
CVHub1 小时前
多模态图文训推一体化平台 X-AnyLabeling 3.0 版本正式发布!首次支持远程模型推理服务,并新增 Qwen3-VL 等多款主流模型及诸多功能特性,等
算法
hoiii1871 小时前
MATLAB实现Canny边缘检测算法
算法·计算机视觉·matlab
夕颜1112 小时前
BeeAI 框架学习记录
后端
qq_430855882 小时前
线代第二章矩阵第四课:方阵的幂
算法·机器学习·矩阵