Совсем недавно (октябрь 2016 года, через шесть лет после OP) сообщение в блоге « Scala и 22 » из Ричарда Даллауэя исследует этот предел:
Еще в 2014 году, когда была выпущена Scala 2.11, было устранено важное ограничение:
Case classes with > 22 parameters are now allowed.
Это может заставить вас подумать, что нет 22 ограничений в Скала, но это не так. Ограничение сохраняется в функциях и кортежах.
Исправление ( PR 2305 ), введенное в Scala 2.11, устранило ограничение для вышеуказанных общих сценариев: построение классов case, доступа к полю (включая копирование) и сопоставление с образцом ( базирующие крайние случаи ).
Это делалось, опуская
unapply
иtupled
для классов case выше 22 полей. Другими словами, пределFunction22
иTuple22
все еще существует.Работа над пределом (post Scala 2.11)
Существует два распространенных способа обхода этого предела.
- Первое - использовать вложенные кортежи. Хотя верно, что кортеж не может содержать более 22 элементов, каждый элемент может быть кортежем
- . Другим распространенным трюком является использование гетерогенных списков (HLists), где нет 22 предела.
Если вы хотите использовать классы case, вам может быть лучше использовать бесформенную реализацию HList. Мы создали библиотеку Slickless , чтобы сделать это проще. В частности недавний
mappedWith
метод преобразуется между бесформеннымиHLists
и классами case. Это выглядит так:import slick.driver.H2Driver.api._ import shapeless._ import slickless._ class LargeTable(tag: Tag) extends Table[Large](tag, "large") { def a = column[Int]("a") def b = column[Int]("b") def c = column[Int]("c") /* etc */ def u = column[Int]("u") def v = column[Int]("v") def w = column[Int]("w") def * = (a :: b :: c :: /* etc */ :: u :: v :: w :: HNil) .mappedWith(Generic[Large]) }
В базе данных Slickless имеется полный пример с 26 столбцами .
Вам необходимо опубликовать проект с использованием netcoreapp2.1
фреймворка без - runtime win-x64
, как показано ниже
dotnet publish --framework netcoreapp2.1 --configuration Release
Настройки публикации по умолчанию в VS 2017 будут нацелены на фреймворк, как показано ниже