Расширение карт классов Scala - PullRequest
2 голосов
/ 05 января 2012

В заводной можно сделать:

class Foo {
  Integer a,b
}
Map map = [a:1,b:2]
def foo = new Foo(map) // map expanded, object created

Я понимаю, что Scala не в каком-то смысле этого слова, Groovy, но мне интересно, поддерживается ли расширение карты в этом контексте

Проще говоря, я попытался и потерпел неудачу с:

case class Foo(a:Int, b:Int)
val map = Map("a"-> 1, "b"-> 2)
Foo(map: _*) // no dice, always applied to first property

Связанная нить , которая показывает возможные решения проблемы.

Теперь, из того, что я смог выкопать, по крайней мере, начиная с Scala 2.9.1, рефлексия в отношении классов дел - это, по сути, запрет. Таким образом, в результате получается, что человек вынужден заниматься созданием объектов вручную, что, учитывая силу Скалы, несколько иронично.

Я должен упомянуть, что вариант использования включает в себя карту параметров запроса сервлета. В частности, используя Lift, Play, Spray, Scalatra и т. Д., Я хотел бы взять очищенную карту параметров (отфильтрованную по слою маршрутизации) и связать ее с экземпляром класса целевого случая без необходимости создания объекта вручную или указания его типов. , Это потребует «надежного» отражения и таких последствий, как «str2Date» для обработки ошибок преобразования типов.

Возможно, в версии 2.10 с новой библиотекой отражений реализация вышеописанного будет хорошей задачей Только 2 месяца в Скала, так что просто поцарапать поверхность; Я не вижу никакого простого способа осуществить это прямо сейчас (для опытных разработчиков Scala, возможно, выполнимо)

Ответы [ 2 ]

5 голосов
/ 05 января 2012

Хорошо, хорошая новость в том, что интерфейс продукта Scala, реализованный всеми классами кейсов, на самом деле не делает это очень сложным. Я являюсь автором библиотеки сериализации Scala под названием Salat, которая предоставляет некоторые утилиты для использования маринованных подписей Scala для получения типизированной информации о полях

https://github.com/novus/salat - посмотрите некоторые утилиты из пакета salat-util.

На самом деле, я думаю, это то, что Салат должен делать - какая хорошая идея.

Re: замечание Д.С.Собрала о невозможности проверки параметров во время компиляции - взятая точка, но на практике это должно работать во время выполнения, как десериализация чего-либо еще без каких-либо гарантий относительно структуры, как JSON или Mongo DBObject. Кроме того, в Salat есть утилиты для использования аргументов по умолчанию там, где они есть.

3 голосов
/ 05 января 2012

Это невозможно, поскольку во время компиляции невозможно проверить, что все параметры были переданы в этой карте.

...