这是Scala 2.8.0测试版的一个后续问题:
What is a proper way to manage flexible, typed, immutable data structures in 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+参数构造函数和一个配对复制方法。 ICK。
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
您可以看到我注释掉了未使用的提取以减少字段数。
也许有更好的方法来做到这一点。我发现这种提取技术有点僵硬,但这可能是最好的。
答案 0 :(得分: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))
答案 1 :(得分:2)
请参阅src / build目录中的genprod.scala,修改它,使用它生成所需的arity,然后重新编译库。您可能需要保留修改后的Scala库。
也许可以将这些额外的类分开,编译它们,并将它们保存在另一个jar文件中。我不知道,但我期待它值得一试。
或者使用地图而不是案例类。
答案 2 :(得分:1)
您是手动编写这些庞大的案例类吗?
如果您以编程方式合成它们,那么您始终可以复制编译器为案例类所做的工作,并在没有Product22限制的情况下获得基本相同的结果。它为案例类所做的一切都在Scala源中具有等效的非案例类。