array_utils 教程

本教程通过取自 src 中文档注释和测试的小例子介绍这些数组辅助函数。要在自己的模块中使用它们,请用 moon add Luna-Flow/luna-utils 添加依赖并导入包 Luna-Flow/luna-utils,之后即可通过 @luna-utils.arr_sum 等名称调用。下面的示例在包内运行,因此省略了前缀。

求和

arr_sum 适用于任何具有加法幺半群结构的元素类型,zero_arr 则按期望类型创建全零数组:

inspect(arr_sum([1, 2, 3, 4]), content="10")
let empty : Array[Int] = []
inspect(arr_sum(empty), content="0")
inspect(arr_abs_sum([1, -2, 3, -4, 5]), content="15")
let zeros : Array[Double] = zero_arr(3)
assert_eq(zeros, [0.0, 0.0, 0.0])
let xs = [5, 2, 8, 1, 9]
inspect(arr_max(xs), content="9")
inspect(arr_min(xs), content="1")
inspect(find([1, 2, 3, 2, 4], 2), content="Some(1)")
inspect(find([1, 2, 3, 2, 4], 5), content="None")

arr_max 和 arr_min 在数组为空时会 panic,因此当数组可能为空时,请先检查 xs.is_empty()。

反转

reverse 返回新数组,而 reverse_inplace 会修改其参数:

let original = [1, 2, 3, 4, 5]
inspect(reverse(original), content="[5, 4, 3, 2, 1]")
inspect(original, content="[1, 2, 3, 4, 5]")
reverse_inplace(original)
inspect(original, content="[5, 4, 3, 2, 1]")

检查一致性

same 和 same_to 比较元素本身;map_same 和 map_same_to 比较元素在某个函数下的像:

inspect(same([1, 1, 1, 1]), content="true")
inspect(same_to([1, 2, 1, 1], 1), content="false")
inspect(map_same([2, 4, 6, 8], x => x % 2), content="true")
inspect(map_same_to([1, 1, 1], 2, x => x * 2), content="true")

same 和 map_same 在数组为空时会 panic。如果数组可能为空且你知道期望值,请使用 same_to 或 map_same_to,它们对空数组返回 true。

后续阅读

API 参考给出了全部签名,设计说明解释了约束以及对空数组的处理。在依赖边界情况的行为之前,请对照 src/array_utils_test.mbt 中的测试加以确认。