Создание глобального Groovy закрытия - PullRequest
1 голос
/ 06 апреля 2011

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

a.groovy

def header = Tools.&header
header 'groovy script a'

b.groovy

def header = Tools.&header
header 'groovy script b'

tools.groovy

class Tools {
    def static header(String str) {
        println("\n${str}")
        println("-" * 80)
    }
}

Я бы хотел избежать:

def header = Tools.&header

в каждом скрипте groovy, где я хотел бы использовать Tools.header () (и просто использовать закрытие заголовка при импорте пакета инструментов). Я попытался поместить определение после класса Tools, но это не сработало. Можно ли это сделать? Есть ли лучший способ справиться с этим?


РЕДАКТИРОВАТЬ: (с использованием метакласса и метода оценки, если нет простого способа включить внешний сценарий):

a.groovy

evaluate(new File("Tools.groovy"))
header 'groovy script a'

b.groovy

evaluate(new File("Tools.groovy"))
header 'groovy script b'

tools.groovy

Object.metaClass.header = {str ->
    println("\n${str}")
    println("-" * 80)
}

Ответы [ 2 ]

7 голосов
/ 06 апреля 2011

println на самом деле не является глобальным закрытием.Это метод, который добавляется в java.lang.Object с использованием мета-программирования Groovy.Поскольку все классы расширяются Object, включая класс сценариев, заключающий в себе код, запускаемый в Groovy консоли, println можно вызывать из любого места.

Вы можете добавить свои собственные методы в Object.Запустите этот код в консоли Groovy, чтобы увидеть его в действии:

// Add a global sayHello() method
Object.metaClass.sayHello = {-> println 'hello' }

// Try it out
sayHello()
0 голосов
/ 06 апреля 2011

import static Tools.header должен сделать свое дело.В этом случае вам не нужно замыкание, так как вы вызываете простой метод.Если вам нужно передать header как замыкание где-то в вашем коде a.groovy или b.groovy, то &header все еще можно использовать.

...