You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Groovy实现调度DSL如何支持无引号字符串参数调用?

Groovy 无引号DSL实现方案

你可以通过Groovy的两个原生特性实现需求:

  1. 重写propertyMissing方法:捕获所有未定义的属性访问请求,直接返回属性名对应的字符串
  2. 配置闭包解析策略为DELEGATE_FIRST:让闭包优先从你指定的delegate(Scheduler实例)上查找属性/方法,而非优先从闭包所有者(这里就是测试类)查找

修正后的Scheduler类代码

class Scheduler {
  String type

  def static create(closure) {
    Scheduler scheduler = new Scheduler()
    closure.delegate = scheduler
    // 新增:设置闭包优先使用delegate解析属性和方法
    closure.resolveStrategy = Closure.DELEGATE_FIRST
    closure()
    return scheduler.print_values()
  }

  def schedule(String type) {
    this.type = type
  }
  
  def print_values() {
    return "${this.type} scheduled"
  }

  // 新增:捕获所有未定义的属性访问,直接返回属性名字符串
  def propertyMissing(String name) {
    return name
  }
}

实现逻辑说明

  • 当你在闭包里写schedule meeting时,Groovy会按以下流程执行:
    1. 闭包优先在Scheduler实例上查找meeting属性
    2. 未找到对应属性时触发propertyMissing方法,直接返回属性名"meeting"字符串
    3. 字符串自动作为参数传入schedule方法完成赋值
  • 该实现无需提前定义任何调度类型变量,支持任意调度类型直接使用,比如schedule appointment、schedule interview都可以直接生效,不需要额外修改代码。

内容的提问来源于stack exchange,提问作者Echo C

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 02:15:07