Рефакторинг функциональности копирования - PullRequest
1 голос
/ 10 декабря 2010

Возможно ли рефакторинг следующего?

  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)    
  }

Ответы [ 2 ]

1 голос
/ 10 декабря 2010

Вы могли бы сделать это с огромным количеством отражений, несколько хрупким способом, используя (недокументированные) методы copy$default$1 и сопоставляя типы с методом copy, и имея оба реализуют черту, включающую def a: List[String] и def a_=(a0: List[String]). Но это плохая идея; поддержка не полностью есть (например, если вы смешаете ее с классом, не относящимся к регистру, он потерпит неудачу во время выполнения), он медленный и экономит лишь небольшое количество печатания.

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

1 голос
/ 10 декабря 2010

copy нельзя извлечь в суперкласс (если это то, что вы ищете) - это метод, сгенерированный компилятором.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...