Управление гибкими, типизированными, неизменяемыми структурами данных в Scala в 2.8.x - PullRequest
2 голосов
/ 09 февраля 2010

Это продолжение теперь, когда бета-версия Scala 2.8.0 вышла на этот вопрос:

Как правильно управлять гибкими типизированными неизменяемыми структурами данных в Scala?

Новый метод заключается в копировании класса дел, например,

case class Person(name:String, email:String)

val bob = Person("Bob", "bob@z.com")
val jill = bob.copy(name = "Jill")

Это прекрасно работает, за исключением того факта, что Scala, кажется, ограничивает меня 22 (?) Свойствами в классе case. Это может показаться много, в моем случае этого недостаточно.

При 23 я получаю: «ошибка: тип Function23 не является членом пакета scala». Я мог бы определить свою собственную функцию23 и т. Д., Но я не знаю последствий этого.

Так что теперь я вернулся к исходной точке. Мне нужно использовать публичные переменные, которых я пытаюсь избежать, или создать конструктор 26+ параметров и метод парного копирования. Ик.

22 здесь кажется довольно произвольным пределом. Есть ли способ обойти это?

Это для импорта данных, который выглядит примерно так:

new CatalogImportRecord() {
    override val List(SVal(vendorSku), SVal(title), IVal(issues),
      _, // YToMVal(termMonths),
      DVal(sellPrice), DVal(buyPrice), DVal(retailPrice), NotesVal(allowsNew, allowsRenewals),
      _) //DateValMdy(lastUpdated))
      = fields

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

Может быть, есть лучший способ сделать это. Я считаю эту технику извлечения немного жесткой, но это может быть к лучшему.

Ответы [ 3 ]

4 голосов
/ 09 февраля 2010

Код генерируется автоматически, поэтому вы можете перекомпилировать библиотеку Scala (с измененными настройками), если собираетесь использовать проект только самостоятельно.

Если вы набираете более 23 вещей вручную в классах caseрассмотрите возможность группировки значений любым удобным для вас способом - используйте кортежи, чтобы сгруппировать вещи, которые имеют смысл, или используйте подклассы для более плотной группировки.Обновление будет немного неловким, но если вы сгруппируете вещи, которые нужно обновить, это должно помочь.

Например, попробуйте это в Scala 2.8:

((1,2,3,4,5,6,7,8,9),(1,2,3,4,5,6),(1,2,3,4,5,6,7,8,9)).copy(_2=(4,5,6,7,8,9))

Еслиу вас уже есть оригинал в val, еще проще изменить только одну вещь:

val a = (1,2,(1,2))
a.copy(_3=a._3.copy(_1=3))
2 голосов
/ 09 февраля 2010

Посмотрите genprod.scala в каталоге src / build, измените его, используйте его для генерации желаемой арности, а затем перекомпилируйте библиотеку. Вам, вероятно, потребуется сохранить измененную библиотеку Scala.

Возможно, возможно разделить эти дополнительные классы, скомпилировать их и сохранить в другом файле jar. Не знаю, но стоит попробовать, я ожидаю.

Или используйте Карту вместо класса дел.

1 голос
/ 09 февраля 2010

Вы пишете эти гигантские кейсы вручную?

Если вы синтезируете их программно, то вы всегда можете скопировать то, что делает компилятор для классов дел, и получить по существу тот же результат без ограничения Product22. Все, что он делает для case-классов, имеет эквивалент в исходном коде Scala для не-case-класса.

...