Как смешать локальные и переопределить членов в назначении кортежа - PullRequest
0 голосов
/ 26 января 2019

У меня есть функция синхронизации:

def time[R](code: => R, t: Long = System.currentTimeMillis()) = 
  (code,  System.currentTimeMillis() - t )

Возвращает кортеж возвращаемого значения кода и время выполнения кода.

У меня есть черта разных вещей, которые я синхронизирую по нескольким объектам:

trait TimingStats {
  var step1Time, step2Time, step3Time : Long
}

У меня есть объект, который делает то, что я рассчитываю:

class Process extends TimingStats {
  var (step1Result, step1Time) = time(Thread.sleep(1000))
  var (step2Result, step2Time) = time(Thread.sleep(2000))
  var (step3Result, step3Time) = time(Thread.sleep(3000))
}

(Конечно, Thread.sleep на самом деле является полезным кодом, а не просто директивой сна)

Но это не работает, если компилятор не может выполнить переменную «step1Time нуждается в модификаторе override».

Как мне на самом деле пытаться это сделать?

PS - Более широкий контекст заключается в том, что я затем сообщаю эту статистику в Prometheus как часть мониторинга приложений, на случай, если вы собираетесь предложить вместо этого различные инструменты профилирования.

1 Ответ

0 голосов
/ 26 января 2019

Проблема не в кортежах, проблема в том, что вы не можете переопределить неизменяемое значение изменяемым значением.Замените var на val, и он скомпилируется.

...