代码之家  ›  专栏  ›  技术社区  ›  Alex Neth

用Scala在2.8.x中管理灵活的、类型化的、不可变的数据结构

  •  2
  • Alex Neth  · 技术社区  · 16 年前

    What is a proper way to manage flexible, typed, immutable data structures in Scala?

    新技术是复制一个case类。

    case class Person(name:String, email:String)
    
    val bob = Person("Bob", "bob@z.com")
    val jill = bob.copy(name = "Jill")
    

    对我来说,这似乎是一个伟大的限制case类中的属性。这可能看起来很多,对我来说还不够。

    对于23,我得到:“错误:类型Function23不是scala包的成员”。我可以定义我自己的函数,等等,但我不知道这意味着什么。

    所以现在我回到原点。我需要使用public vars,这是我试图避免的,或者创建一个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 回复  |  直到 9 年前
        1
  •  4
  •   Rex Kerr    16 年前

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

    如果您要在case类中手工键入23个以上的内容,请考虑以任何方便的方式对值进行分组--使用元组将有意义的内容组合在一起,或者使用子案例类来更紧密地分组。这会让更新变得更尴尬,但是如果你把需要更新的东西放在一起,这会有所帮助。

    例如,在Scalout中:

    ((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
  •  2
  •   Daniel C. Sobral    16 年前

    看到了吗通用产品.scala在src/build目录中,修改它,使用它生成所需的arity,然后重新编译库。您可能需要保留一个修改过的Scala库。

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

    或者使用映射而不是case类。

        3
  •  1
  •   Randall Schulz    16 年前

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