Почему при запуске примера рекурсии замыкания в оболочке Groovy появляется ошибка «Нет подписи метода»? - PullRequest
4 голосов
/ 18 августа 2011

Я пытаюсь поэкспериментировать с примером рекурсии Groovy замыкания из http://groovy.codehaus.org/JN2515-Closures.

Я сохранил фрагмент в файле с именем recursionTest.groovy и загрузил его в оболочку, но получаю сообщение «Нет подписи ошибки метода»:

// recursionTest.groovy   

def results = [];
{ a, b ->
  results << a
  a<10 && call(b, a+b)
}(1,1)

assert results == [1, 1, 2, 3, 5, 8, 13]


groovy:000> load recursionTest.groovy
===> []
ERROR groovy.lang.MissingMethodException:
No signature of method: java.lang.Boolean.call() is applicable for argument types: (groovysh_evaluate$_run_closure1) values: [groovysh_evaluate$_run_closure1@6b7599cc]
Possible solutions: wait(), any(), wait(long), and(java.lang.Boolean), each(groovy.lang.Closure), any(groovy.lang.Closure)
        at groovysh_evaluate.run (groovysh_evaluate:1)
        ...
groovy:003> 

Что происходит?

Ответы [ 2 ]

2 голосов
/ 18 августа 2011

У меня нет идеального ответа для вас, но похоже, что В GroovySH есть некоторые хаки , которые могут испортить его при работе с некоторыми функциями Groovy.

Пример кода, который у вас есть, прекрасно работает в groovyConsole (это графический редактор, в котором гораздо проще играть), а также запускается с помощью groovy recursionTest.groovy.

Я не нашел решения, которое правильно работает в Groovy Shell, но я бы не советовал использовать его для обучения, в любом случае.

1 голос
/ 24 марта 2014

Я думаю, что в вашем скрипте есть две проблемы:

  1. В оболочке у вас есть определенная область. Переменные, которые связаны, находятся в «связывании». Чтобы получить один в привязке, вы должны убедиться, что он НЕ ОПРЕДЕЛЕН , прежде чем использовать его! Так что нет def results. Однако это не та ошибка.

  2. Ошибка, которую составляет приведение, может быть исправлена ​​с помощью с именем рекурсии закрытия . Это в сочетании с не определением результатов дает:

-

results = []; 

f = { a, b ->   
results << a   
a<10 && call(b, a+b) }(1,1)

assert results == [1, 1, 2, 3, 5, 8, 13]
...