groovy 如何定义/声明闭包委托的类型?

6qftjkof  于 2023-03-07  发布在  其他
关注(0)|答案(1)|浏览(177)

我尝试定义一个构建器模式来为Jenkins CI/CD管道构建Cucumber操作的命令行参数。在该模式中,我尝试使用Closure方法编写数据类,以备某些人喜欢使用该语法(尝试灵活性)。因此,我定义了以下内容(为简洁起见进行了删节):

class CucumberArgs {
    private Boolean _help
    
    CucumberArgs() {}

    Boolean getHelp() {
        return this._help;
    }

    CucumberArgs help(Boolean value) {
        this._help = value;
        return this;
    }
    
    static CucumberArgs with(Closure<CucumberArgs> builder) {
        builder.delegate = new CucumberArgs();
        builder.resolveStrategy = Closure.DELEGATE_ONLY;
        return builder.call();
    }

    @Override
    String toString() {
        if(this._help) {
            return 'cucumber-js --help'
        }
    }
}

def args = CucumberArgs.with {
    help(true);
}

println args
// 'cucumber-js --help'

正如我所说的,代码还有很多,但它是我正在做的事情的一个简洁的例子。在IntelliJ中,我得到的消息是No candidates found for method call help.我肯定以前已经给出了答案,但我似乎无法选择正确的搜索查询。官方文档是首选,但我会很好地与工作代码样本。

cx6n0qe3

cx6n0qe31#

所以我把它放到Intellij的Groovy控制台中运行。我做了一点清理,但大部分都是表面的。我不能让它失败,所以我认为大部分都很好。在toString()中,您并不是在所有情况下都返回字符串,我添加了@DelegatesTo,这样Intellij就知道您的委托是什么。它识别help方法,但即使没有这些,它也起作用了。这是最实质性的变化。

class CucumberArgs {
    private Boolean _help

    CucumberArgs() {}

    Boolean getHelp() {
        return this._help
    }

    CucumberArgs help(Boolean value) {
        this._help = value
        return this
    }

    static CucumberArgs with(@DelegatesTo(CucumberArgs) Closure<CucumberArgs> builder) {
        builder.delegate = new CucumberArgs()
        builder.resolveStrategy = Closure.DELEGATE_ONLY
        return builder.call()
    }

    @Override
    String toString() {
        if(this._help) {
            return 'cucumber-js --help'
        } else {
            return ''
        }
    }
}

def args = CucumberArgs.with {
    help(true)
}

println args
// 'cucumber-js --help'

相关问题