10

私は Scala にかなり慣れていないので、特性から得られるデータを保持しながらケース クラスをコピーする最良の方法について質問があります。たとえば、次のものがあるとします。

trait Auditing {

  var createTime: Timestamp = new Timestamp(System.currentTimeMillis)
}

case class User(val userName: String, val email: String) extends Auditing

val user = User("Joe", "joe@blah.com")

次に、1 つのパラメーターを変更して新しいコピーを作成します。

val user2 = user.copy(email = "joe@newemail.com")

上記の例では、プロパティ createTime は User ケース クラスのコンストラクタで定義されていないため、コピーされません。だから私の質問は: createTime をコンストラクターに移動することはオプションではないと仮定すると、特性からの値を含む User オブジェクトのコピーを取得するための最良の方法は何ですか?

私はScala 2.9.1を使用しています

前もって感謝します!ジョー

4

3 に答える 3

6

その動作でcopyメソッドをオーバーライドできます。

case class User(val userName: String, val email: String) extends Auditing
{
  def copy(userName = this.userName, email = this.email) {
   val copiedUser = User(userName, email)
   copiedUser.createTime = createTime
   copiedUser      
  }
}
于 2012-11-02T02:25:02.407 に答える
3

Reuben 以外の解決策はないと思いますが、コンストラクターの引数をそのままにしておくという要件がわかりません。これは最も自然な解決策です。

case class User(userName: String, email: String, 
   override val createTime:Timestamp = new Timestamp(System.currentTimeMillis)) 
      extends Auditing

ユーザーが を上書きできないようにするcreateTime場合でも、次を使用できます。

case class User private (userName: String, email: String, 
   override val createTime:Timestamp) extends Auditing {
   def this(userName: String, email: String) =
     this(userName, email, new Timestamp(System.currentTimeMillis))
}

new User("Joe", "joe@blah.com")唯一の欠点は、プライマリ コンストラクターが非公開になったため、を記述する必要があることです。

于 2012-11-02T07:35:15.043 に答える