Groovy 1.8 a b c 风格

标签 groovy dsl

我需要有关 Groovy 1.8 DSL 功能之一的帮助。

考虑this测试用例:

/**
 * For odd number of elements, treat the last element as a call to a getter
 *
 * case            a b  c
 * equivalent      a(b).getC()
 */
void testTrailingElementAsGetter() {
    def drank = false
    def more = 'more'
    def drink = { String s -> [milk: { drank = true }()] }

    def d = drink more milk

    assert drank
}

如果我将 [milk: { drrank = true }()] 更改为 [foo: { drrank = true }()],测试用例仍然通过。这可能是新实现中的错误,还是我在 Groovy 语法中遗漏了某些内容?

编辑 - 已解决:@han 和 @Gareth Davis 都发布了正确的线索。以下是了解此测试的更多详细信息:

    groovy:000> more = 'more'
    ===> more 
    groovy:000> drank = false 
    ===> false
    groovy:000> drink = { String s -> [milk: { drank = true }()] }
    ===> groovysh_evaluate$_run_closure1@20c87621
[A] groovy:000> drink more
    ===> {milk=true}    
[B] groovy:000> drank  
    ===> true          
    groovy:000> drink more milk
    ===> true
    groovy:000> drink more water
    ===> null 

[A]返回一个 map ,正如@han指出的那样。在 [B] 行中,drank 已经是 true,因为闭包在创建后立即执行(正如@Gareth Davis 指出的那样),类似到JavaScript module pattern 。我不认为这个“测试”是展示此功能的最佳方式 - drank 的副作用是误导性的。

最佳答案

问题出在:

def drink = { String s -> [milk: { drank = true }()] }

更改为:

def drink = { String s -> [milk: { drank = true }] }

尾部括号实际上在创建时调用闭包,而不是在运行 DSL 时调用。

def d = drink more milk

// d is actually a closure not a boolean you would need to invoke it in order to get the required side effect of setting drank.
d.call()

关于Groovy 1.8 a b c 风格,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6646811/

相关文章:

java - 页面上有两个字符集标签,该采用哪个?

java - 沙盒 Java/Groovy/Freemarker 代码 - 防止执行特定方法

grails - 在grails中创建多个记录

java - Spring Integration Java DSL .handle(String beanName, String methodName)

java - Spring Integration Java DSL -- 聚合器的配置

antlr - 使用 ANTLR4 设计灵活语言应用程序的一般策略

groovy - geb 使用葡萄 - 下载失败 : commons-codec#commons-codec;1. 6!commons-codec.jar

groovy - 通过键获取 Groovy 映射值

python - 有没有办法以编程方式生成 Python 字节码?

Scala 运算符重载多个参数