#grails #groovy #arguments #closures
Вопрос:
Я пишу службу в Grails 3.
Допустим, я написал подобный метод для «постсервиса»
По умолчанию он должен сортировать категории по их идентификатору.
List<Category> getCategories(List<Post> posts) {
List<Category> categories = ... // logic to get categories
categories.sort { it.id }
return categories
}
Что, если бы я хотел добавить гибкость для сортировки. Например, позже мы хотим вместо этого отсортировать по годам.
Я хочу добавить закрытие сортировки в качестве необязательного аргумента. Я попробовал это.
List<Category> getCategories(List<Post> posts, Closure sortClosure = null) {
List<Category> categories = ... // logic to get categories
if (sortClosure == null) {
categories.sort { it.id }
} else {
// Trying to use the sortClosure. Not sure if these will work.
// sortClosure << categories.sort
// categories.sort sortClosure
}
return categories
}
Я пытаюсь запустить метод с закрытием
List<Category> categories = postsService.getCategories(posts, { it.year })
Но я сталкиваюсь с ошибками. Это приводит к внутренней ошибке сервера в этой строке.
List<Category> categories = postsService.getCategories(posts, { it.year })
Класс java.lang.неучтенная ошибка
Сообщение null
Вызвано PostsController$_select_closure5: метод (Ljava/lang/Объект;Ljava/lang/Объект;)V не найден
Что я здесь делаю не так? Могу ли я использовать закрытие таким образом?
Комментарии:
1. Можно ли с уверенностью предположить, что вы не получите ошибку выше, если запустите код, как описано выше (с закомментированной логикой сортировки)? Кроме того, всякий раз, когда я вижу этот класс ошибок
(L...)V
, я перезапускаю приложение, потому что не удалось выполнить горячую перезагрузку кода. Вы можете это исключить?2. @cfrick Хорошая идея убрать другую логику! Однако вы были правы насчет сбоя горячей перезарядки. Если вы добавите это в качестве ответа, я отмечу его как правильный и отредактирую свой вопрос, чтобы сделать его более полезным для других.