【问题标题】:Groovy function without parenthesis and argument starting with capital letter causing error没有括号和以大写字母开头的参数的 Groovy 函数导致错误
【发布时间】:2015-08-28 06:59:22
【问题描述】:

我有一个包含成分列表的类,并提供了一个 SERVE 函数来打印这些成分。

class CookDSL {
  List<String> ingredientsToCook

  CookDSL(List<String> ingredients){
     ingredientsToCook=ingredients
  }

  void SERVE(Closure closure){closure(ingredientsToCook)}
}

这是返回上述类实例的 DSL 函数:

CookDSL COOK(List<String> ingredients){
  new CookDSL(ingredients)
}

现在我可以使用如下所示的 DSL 并通过打印所有成分来正常工作:

def ingredients = ["X", "Y", "Z"]
COOK ingredients SERVE {it-> println(it)}

输出:

[X, Y, Z]

为了保持上述 DSL 的一致性,我尝试将成分命名为成分,而 Groovy 不喜欢它。

def Ingredients = ["X", "Y", "Z"]
COOK Ingredients SERVE {it-> println(it)}

输出:

startup failed:
Script1.groovy: 16: unexpected token: Ingredients @ line 18, column 10.
   COOK Ingredients SERVE {it-> println(it)}
        ^

1 error

如果成分变量用括号括起来,它就可以正常工作:

def Ingredients = ["X", "Y", "Z"]
COOK(Ingredients) SERVE {it-> println(it)}

输出:

[X, Y, Z]

不确定我是否做错了什么,或者 Groovy 是否在某些情况下限制使用以大写字母开头的变量?

Groovy 版本:2.3.8

【问题讨论】:

  • 类以大写开头,变量不应该

标签: groovy


【解决方案1】:

正如@tim_yates 所说,大写字母可能会使解析器感到困惑,也许它将它们理解为类标识符。我通常看起来DSLs uncapitalized

class CookDSL {
  List<String> ingredientsToCook

  void serve(Closure closure){closure(ingredientsToCook)}
}

CookDSL cook(List<String> ingredients){
  new CookDSL(ingredientsToCook: ingredients)
}

def ingredients = ["X", "Y", "Z"]
cook ingredients serve {it-> println(it)}

如果将结果设置为 var,它不会报错。或许它不再模棱两可了:

def COOK = { ingredients -> new CookDSL(ingredientsToCook: ingredients) }

def Ingredients = ["ribs", "bacon", "pineapple"]
def cooked = COOK Ingredients SERVE { "cooked $it" }
assert cooked == ["cooked ribs", "cooked bacon", "cooked pineapple"]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-05
    • 1970-01-01
    • 2021-09-24
    • 1970-01-01
    • 2011-09-24
    • 1970-01-01
    相关资源
    最近更新 更多