Groovy: знак двоеточия в закрытии? - PullRequest
2 голосов
/ 22 января 2020

Я пытаюсь создать свой собственный Dsl и играю с разными стилями замыканий в groovy. Я наткнулся на следующий фрагмент:

myClosure {
  testProperty: "hello!"
}

Но не могу понять, является ли этот код правильным и как я могу получить доступ к этому testProperty. Это действительно? Как я могу прочитать "hello!" значение?

Ответы [ 2 ]

2 голосов
/ 22 января 2020

А пока давайте отложим замыкания, рассмотрим следующий код:

def f1() {
  testProperty : 5  
}
def f2() {
  testProperty : "Hello"
}
println f1()
println f1().getClass()
println f2()
println f2().getClass()

Он компилируется (для этого синтаксис действителен) и печатает:

5
class java.lang.Integer
Hello
class java.lang.String

Итак, что вы видите здесь просто помеченный оператор (groovy поддерживает метки см. здесь )

И нижняя строка кода f1 (как и f2):

def f1() {
  return 5 // and return is optional, so we don't have to write it
}

С замыканиями то же самое с этой точки зрения:

​def method(Closure c) {
  def result = c.call()
  println result
  println result.getClass()
}

method {
   test : "hello"
}

Это печатает

hello
class java.lang.String

, как и ожидалось

1 голос
/ 22 января 2020

Обычно в DSL у вас есть либо:

mySomething {
  a = 42
  b = 84
}

, что соответствует настройке свойства

, либо это:

mySomething( a:42, b:84 ){
   somethingElse{}
}

, который является вызовом метода с Map -literal.

Показанный вами код не используется, как объяснил @ mark-bramnik.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...