Различное поведение синтаксиса Groovy «имя: выражение» - PullRequest
0 голосов
/ 05 января 2019

Я знакомлюсь с Groovy и немного удивлен, что работает следующий код:

class Main {
    static void main(String[] args) {
        abc : 1
    }
}

Что такое abc : 1? Я думаю, что это может быть карта в следующем коде:

class Main {

    static void main(String[] args) {
        print(abc : 1)
    }

}

приводит к выводу на консоль [abc:1], но

class Main {

    static void main(String[] args) {
        def map = abc : 1
    }

}

не компилируется !!! Но самая запутанная часть - это завершение выражения в замыкание

class Main {

    static void main(String[] args) {
        def closure = {-> abc : 1}
        print closure()
    }

}    

приводит к выводу на консоль 1, а не [abc:1]. Есть ли какая-то польза от толстой кишки, о которой я не знаю?

1 Ответ

0 голосов
/ 05 января 2019

В вашем примере 2 различных контекста использования.

1. Именованные параметры

В первом примере вы использовали именованные параметры Groovy . Следующий Groovy код:

print(abc: 1)

является эквивалентом

print([abc: 1])

Groovy использует карту для представления именованных аргументов, и эта конструкция доступна только при вызове метода. Вот почему, когда вы попытались присвоить abc : 1 переменной, компиляция завершилась с ошибкой.

2. Помеченные заявления

Второй пример, который использует замыкание, является примером помеченного оператора . Если вы отформатируете свой код, он будет выглядеть так:

def closure = { ->
    abc:
    return 1 // return is optional of course in this case. I added it to make the example more explicit
}

print closure() // prints 1

Имейте в виду, что метки не влияют на семантику кода, поэтому вы получаете 1 взамен. Метки присутствуют в абстрактном синтаксическом дереве, и их можно использовать для манипулирования кодом (например, Spock Framework использует метки, такие как given, when, then, чтобы добавить определенное поведение в тест).

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