2

现在 Scala 2.8.0 beta 已经解决了这个问题,这是一个后续行动:

在 Scala 中管理灵活、类型化、不可变数据结构的正确方法是什么?

新技术是复制一个案例类,例如

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

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

这很好用,除了 Scala 似乎将我限制为案例类中的 22 个(?)属性。这可能看起来很多,在我的情况下还不够。

使用 23,我得到:“错误:Function23 类型不是包 scala 的成员”。我可以定义我自己的 Function23 等,但我不知道它的含义。

所以现在我回到第一方。我需要使用我试图避免的公共变量,或者创建一个 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

您可以看到我注释掉了未使用的提取以减少字段数量。

也许有更好的方法来做到这一点。我发现这种提取技术有点死板,但这可能是最好的。

4

3 回答 3

4

代码是自动生成的,因此如果您只打算自己使用该项目,则可以重新编译 Scala 库(更改设置)。

如果您在案例类中手动输入 23 多个内容,请考虑以任何方便的方式对您的值进行分组——使用元组将有意义的事物组合在一起,或者使用子案例类将事物更紧密地分组。它会使更新变得更加尴尬,但是如果您将需要更新的内容组合在一起,它应该会有所帮助。

例如,在 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))
于 2010-02-09T03:28:36.110 回答
2

查看 src/build 目录下的 genprod.scala,修改它,使用它生成所需的 arity,然后重新编译库。您可能需要保留一个修改后的 Scala 库。

也许可以将这些额外的类分开,编译它们,然后将它们保存在另一个 jar 文件中。我不知道,但我希望它值得一试。

或者使用 Map 而不是案例类。

于 2010-02-09T11:08:35.370 回答
1

您是在手动编写这些庞大的案例类吗?

如果您以编程方式合成它们,那么您始终可以复制编译器对案例类所做的工作,并在没有 Product22 限制的情况下获得基本相同的结果。它为案例类所做的一切在 Scala 源代码中都有一个非案例类的等价物。

于 2010-02-09T04:23:57.373 回答