/ / Scala wrap metoda klasy kopii - scala, copy, case-class

Scala wrap metoda klasy kopiowania - scala, copy, case-class

Czy można owinąć kopię klasy case?metoda, taka jak poniżej, gdzie chcę zawsze ustawiaj znacznik czasu, gdy kopiowana jest klasa sprawy, bez ręcznego definiowania wszystkie parametry metody owijania?

case class NodeUpdate(val ip: String,
val actor: Option[ActorRef] = None,
val status: Status = Offline,
val asOf: Long = System.currentTimeMillis) {

// Error type mismatch; found : Seq[Any] required: String
def stampedCopy(values: Any*) = copy(values, asOf = System.currentTimeMillis)

// This works but needs to be updated for each modification
// So I would prefer to use something like what I have above
def stampedCopy2(ip: String = ip, actor: Option[ActorRef] = actor, status: Status = status) =
copy(ip, actor, status, System.currentTimeMillis)

}

Edycja: Szybka kontynuacja w przypadku, gdy ktoś wie - czy na ogół bezpieczne jest umieszczenie Akka ActorRef w klasie spraw? Czy są to stabilne, niezmienne obiekty?

Odpowiedzi:

1 dla odpowiedzi № 1

Po prostu zrobiłbym to w dwóch etapach. W takim przypadku lepszą nazwą byłoby coś w stylu updateTime.

  case class NodeUpdate(val ip: String,
val asOf: Long = System.currentTimeMillis) {

// Error type mismatch; found : Seq[Any] required: String
def stampedCopy() = copy(asOf = System.currentTimeMillis)
}

val update1 = NodeUpdate("ip")                  //> update1  : NodeUpdate(ip,1411585428244)
val update2 = update1.stampedCopy               //> update2  : NodeUpdate(ip,14115 85428456)
val update3 = update1.copy(ip="ip3").stampedCopy//> update3  : NodeUpdate(ip3,1411585597836)

0 dla odpowiedzi nr 2

copy jest generowany kod. Tak więc krótka odpowiedź brzmi Nie.

Możesz jednak zadeklarować Stamped klasa przypadku, która wykona zadanie:

case class Stamped[T](data:T, asOf: Long = System.currentTimeMillis)

(Również nie musisz pisać val dla parametrów konstruktora klasy case. vals są tworzone automatycznie.)

P.S. Z tego co wiem ActorRef jest niezmienny. Możesz również rozważyć użycie ActorPath