Skip to content

结果构建器 ​

结果构建器让内容块按顺序累计表达式,生成一个强类型结果。它适用于 UI、文本及其他领域对象。

norm
Row {
  Button("全部") { this.reload(null) }
  Button("未完成") { this.reload(false) }
  Button("已完成") { this.reload(true) }
}

参数以 @BuildWith(Builder.class) 标记,类型必须是零参数 Function<Result()>。构建器实现 std.build.ResultBuilder<Element, Result>,提供可无参数调用的构造入口。公共声明以 builders.norm 为准。

每次执行内容回调都会创建独立构建器。表达式语句按 Element 检查类型并调用 add;末尾调用 finish,包括空块。if 只累计选中分支,for 按迭代顺序累计;局部声明与赋值保留原有行为,不贡献元素。异常在原位置传播。内容块不允许 return 或带值的 break。

嵌套的事件回调保持普通函数语义。直接传入已经存在的函数值时,不转换该函数体。构建器注解不改变普通集合的分隔符规则。

这个可执行示例组合了结果构建器、字段句柄、词法引用与集合结果:

norm
import std.build.BuildWith
import std.build.ResultBuilder

class Lines implements ResultBuilder<String, List<String>> {
  private List<String> entries = []

  Void add(String value) {
    entries.add(value)
  }

  List<String> finish() {
    return entries
  }
}

List<String> report(@BuildWith(Lines.class) Function<List<String>()> content) {
  return content()
}

class Task { public String title }

Void countUpdate(ref<Integer> count) {
  *count = *count + 1
}

main() {
  Task task = Task(title: "Draft")
  FieldHandle<String> title = Task.title.field.bind(task)
  Integer updates = 0
  title.write("Ready")
  countUpdate(count: &updates)

  List<String> lines = report {
    "Task: " + title.read()
    if updates > 0 { "Updated ${updates} time" }
    for word : ["checked", "published"] { word }
  }
  for line : lines { printLine(line) }
  List<String> empty = report {}
  printLine(empty.size())
  List<String> independent = report { "Separate" }
  printLine(independent[0])
}
text
Task: Ready
Updated 1 time
checked
published
0
Separate

前端转换统一由 ResultBuilderLowering 提供;编译器不识别特定 UI 组件名称。执行、泛型、诊断和增量编译的契约测试见 ResultBuilderExecutionTest。

Norm 0.25