Код работает в оболочке, но не как скрипт — MissingPropertyException

Я изучаю Groovy и наткнулся на это любопытное поведение. Выполнение следующего кода в groovysh работает без проблем, но сохранение его как foo.groovy и запуск через groovy foo.groovy приводит к MissingPropertyException: No such property: a for class: foo в строке 3:

def a(n) { n*n }
def x(m) { m(2) }
x(a)

Изменение a на закрытие a = { n -> n*n } устраняет эту ошибку, но я хотел бы избежать этого для моего реального варианта использования, который является более сложным. Я также нашел этот вопрос, который касается той же проблемы внутри класса, но решение с использованием this.& неприменимо, так как мой метод не находится внутри класса и исходит из фона Python, и я хотел бы сохранить его таким образом.

Что я делаю неправильно? И где такое поведение задокументировано?


person l4mpi    schedule 21.10.2013    source источник


Ответы (1)


Похоже, что groovysh хранит:

def a(n) { n*n }

как MethodClosure в переменную привязки с именем a

Этого не произойдет вне groovysh, и, как вы видели, вам нужно определить a как замыкание:

def a = { n -> n*n }
def x( m ) { m( 2 ) }
x(a)

Или используйте оператор ссылки на метод &:

def a(n) { n*n }
def x(m) { m(2) }
x( this.&a )
person tim_yates    schedule 21.10.2013