Как определить более краткую функцию scala

Я использую библиотеку akka и предоставляю частичную функцию, которая будет реализована актером во время выполнения с помощью горячей замены.

Горячая замена akka принимает аргумент в виде PartialFunction[Any, Unit]. Я определил свой следующим образом:

class Fake1Reader extends AbstractReader {

  def read: PartialFunction[Any, Unit] = {
    case readingRequest: ReadingRequest => {
      var reading: Reading = new ReadingImpl(readingRequest.getResourceId, "payload",
        Calendar.getInstance.getTime,
      readingRequest.getfrequency, readingRequest.getMappingName,
        readingRequest.getClassificationType,
      readingRequest.getReadingRequestId)
      sendConsumeMessage(reading)
    }
  }
}

поэтому, чтобы использовать эту функцию, я должен предоставить новый Fake1Reader().read.

Есть ли более краткий способ сделать этот класс с помощью применения или расширения функции или частичной функции?


person Sean W    schedule 19.10.2011    source источник
comment
Извините, я не понимаю проблемы. Не могли бы вы уточнить/уточнить?   -  person Viktor Klang    schedule 20.10.2011
comment
Вы можете уменьшить это примерно на 30%, вызвав свою переменную r, а не readingRequest.   -  person Luigi Plinge    schedule 20.10.2011


Ответы (2)


Если ваш AbstractReader не имеет состояния, вы можете определить object вместо class, чтобы избежать создания ненужных объектов при каждом использовании, и поместить туда свои функции как неизменяемые val.

Кроме того, сопутствующий объект akka.actor.Actor определяет тип Receive как псевдоним для PartialFunction[Any, Unit], так что вы можете написать свои частичные функции следующим образом:

package foo    
object Fake1Reader extends AbstractReader {
  import akka.actor.Actor._

  val read: Receive = { 
    case readingRequest: ReadingRequest => /* implementation */
  }
}

использование:

import foo.Fake1Reader._

actorRef ! HotSwap(read)
person incrop    schedule 19.10.2011
comment
это для приложения с чрезвычайно высоким параллелизмом, и я изначально определил его как объект с одной функцией и переключился на класс. Меня беспокоил синглтон, когда многие актеры обращаются к одному и тому же объекту. - person Sean W; 19.10.2011
comment
На самом деле я ищу, чтобы определение класса действительно было функцией, но не уверен, что это возможно. - person Sean W; 19.10.2011
comment
Если он неизменен/не имеет состояния, то любой обмен не является проблемой. Если вы считаете, что у вас возникнут проблемы с производительностью, может оказаться полезным иметь ее на самом деле (или смоделировать ее условия), а затем измерить фактические накладные расходы. - person Emil Sit; 20.10.2011
comment
Вы можете определить функцию как класс, расширив PartialFunction[Any, Unit] и реализовав методы apply и isDefinedAt, но я не думаю, что это поможет улучшить читабельность вашего кода. - person incrop; 20.10.2011

В качестве примечания, это уменьшает тяжелую рутину повторения:

case readingRequest: ReadingRequest => {
  import readingRequest._
  var reading: Reading = new ReadingImpl(getResourceId, "payload",
    Calendar.getInstance.getTime,
  getfrequency, getMappingName,
    getClassificationType,
  getReadingRequestId)
  sendConsumeMessage(reading)
}
person Daniel C. Sobral    schedule 19.10.2011