array_utils 设计

array_utils 汇集了 src/array_utils.mbt 中作用于 Array[T] 的小型泛型辅助函数。本页说明其背后的取舍,以及维护者必须保持稳定的行为。

来自 luna-generic 的约束

每个函数只要求它所需的最弱约束。reverse 和 reverse_inplace 不需要任何约束,find 和各一致性检查需要 Eq,arr_max 和 arr_min 需要 Compare。arr_sum 和 zero_arr 只需要 luna-generic 中的 AddMonoid,即 zero() 和 +,因此适用于任何具有加法幺半群结构的类型,而不仅限于数字。arr_abs_sum 需要 Num 来取负,并需要 Compare 来判断符号。

本包以别名 lg 导入 luna-generic,src/alias.mbt 使得在包内可以不加前缀地使用 AddMonoid 和 Num。公开签名中它们写作 @luna-generic.AddMonoid 和 @luna-generic.Num。

用函数而非方法

MoonBit 不允许一个包为属于核心库的 Array 定义方法,因此这些辅助函数都是包级函数。

空数组

需要以某个元素为起点的函数会读取 arr[0],因此在数组为空时会 panic:arr_max、arr_min、same 和 map_same。它们不返回 Option。其他函数对空数组有自然的结果并直接返回:求和返回 zero(),same_to 和 map_same_to 返回 true,find 返回 None,reverse 返回空数组。新增函数时请保持这一划分,或者在文档中写明例外。

内存分配

reverse、zero_arr、map_same 和 map_same_to 会分配新数组。reverse_inplace 修改其参数,其余函数只读取数据。

维护说明

  • 只要新增或删除函数,或者函数的约束或边界情况行为发生变化,就更新本页和 API 参考,并用 moon info 重新生成 src/pkg.generated.mbti。
  • 源码中 reverse_inplace 的文档注释称它在数组为空时会 panic。实际上不会:循环不会执行,数组保持不变。