【问题标题】:Refactoring copy functionality重构复制功能
【发布时间】:2010-12-10 15:39:17
【问题描述】:

是否可以重构以下内容?

  case class Foo(
    a: List[String]) {
    def +(s: String) = copy(a = s :: a)
  }  

  case class Bar(
    a: List[String],
    b: Int) {
    def +(s: String) = copy(a = s :: a)    
  }

【问题讨论】:

  • 以什么方式?似乎是什么问题?
  • @Daniel Duplicated def +(s: String) = copy(a = s :: a),我想
  • 重复代码。本身不是问题。
  • 看似重复的代码。这些方法是不同的(它们可能有不同的名称),即使它们的类型签名相同,它们仍然不会共享一个公共接口。
  • 如果 Scala 支持更通用的结构类型一致性形式,这是可能的:stackoverflow.com/questions/3471708/…

标签: scala


【解决方案1】:

copy 无法提取到超类(如果这是您要查找的) - 它是编译器生成的方法。

【讨论】:

  • 我知道这一点,但想知道在这种情况下是否有其他方法可以减少重复。
【解决方案2】:

可以通过使用(未记录的)copy$default$1 方法和匹配来自copy 方法的类型,以一种有点脆弱的方式进行大量反射,并且两者都实现了包含def a: List[String]def a_=(a0: List[String]) 的特征。但这是个坏主意;支持并不完全存在(例如,如果你将它混合到一个非案例类中,它会在运行时失败),它很慢,而且它只节省了少量的输入。

如果您遇到这样可以节省大量输入的情况,我建议您改用代码生成(即编写 Scala 代码的 Scala 代码),并额外通过编译。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-02-26
    • 2022-06-10
    • 2021-08-17
    • 2013-08-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-19
    相关资源
    最近更新 更多