Распространение частично осуществленной частичной функции в scala

Я пользуюсь библиотекой актеров Akka здесь. Библиотека актеров определяет частичную функцию, "получают", который актер, который расширяет "актера", должен осуществить, чтобы иметь дело с различными сообщениями. Я создаю иерархию черты для своего заявления, где черта "clockActor" расширяет Актера, и "MasterClock" и "Подчасы" расширяют "clockActor". Я надеюсь добавлять, что общая функциональность часов к черте "часов" получает функцию, но тогда как я добавляю дополнительную функциональность к получить функции во владельце и sub чертах часов?

Короче говоря, мне нужен способ добавить дополнительные операторы выбора к частичной функции. Идеи?

6
nl ja de
Можно составить частичные функции с orElse. Это добилось бы цели?
добавлено автор 4e6, источник
Едва ли. akka библиотека делает весь it' s материал сообщения запросом получают внутренне, таким образом, я не могу получить там приложение orElse к требованию.
добавлено автор Alex, источник
Едва ли. akka библиотека делает весь it' s материал сообщения запросом получают внутренне, таким образом, я не могу получить там приложение orElse к требованию.
добавлено автор Alex, источник
на самом деле, да, orElse делает точно, в чем я нуждаюсь. Неаккуратный googling и только выбор первого результата заставили его выглядеть по-другому, но I' ve получил его работающий теперь.
добавлено автор Alex, источник
на самом деле, да, orElse делает точно, в чем я нуждаюсь. Неаккуратный googling и только выбор первого результата заставили его выглядеть по-другому, но I' ve получил его работающий теперь.
добавлено автор Alex, источник

3 ответы

As already suggested, you could easily compose PartialFunctions using orElse

trait ClockActor {

    def commonOp = {
        case ... => ...
    }

}

class MasterClock extends Actor with ClockActor {

    def receive = commonOp orElse masterOp

    def masterOp = {
        case ... =>  ...
    }

}

class SubClock extends Actor with ClockActor {

    def receive = commonOp orElse subOp

    def subOp = {
        case ... =>  ...
    }

}
14
добавлено

Одна вещь, которая приходит на ум, состоит в том, чтобы сделать что-то вроде этого:

trait ClockActor {
  def pf:PartialFunction[String, Boolean] = {
    case "a" => true
    case v if(_pf.isDefinedAt(v)) => _pf.apply(v)
  }

  def _pf:PartialFunction[String, Boolean] = Map.empty
}

object MasterClock extends ClockActor {

  override def _pf:PartialFunction[String, Boolean] = {
    case "b" => false
  }

  println(pf("a"))
  println(pf("b"))

}

который произведет:

scala> MasterClock
true
false

Стоимость , верный , поступает из определения в частичной функции Черты , ClockActor , , ложный , происходит из Объекта MasterClock .

1
добавлено
@Alex, я заставил быстрое отредактировать, который мог бы помочь больше с тем, чего вы надеетесь достигать. Я изменил черту, чтобы иметь две функции, одна pf , который будет общественным и _pf , который по умолчанию пуст и был бы отвергнут в классе по мере необходимости. Это - по существу то же самое как, что я имел прежде, но этот способ, которым пользователь не должен волноваться о запросе супер начиная с общественных требований, был бы к pf функция черты.
добавлено автор jcern, источник
Да это работает. У меня, казалось, была идея, что, когда вы "отвергаете" функцию тогда, вы наклоняетесь, касаются оригинала. Если я буду иметь тогда, то я буду использовать этот способ сделать вещи, но I' m ищущий больше путь, который люди, которые осуществляют подклассы don' t должны заботиться о запросе супер или любом внедрении в родительской черте.
добавлено автор Alex, источник
Получил работу вариантов, но совершенно другой путь. класс, MasterNode расширяет treeNode {определение masterReceive:Receive = {случай "specificBehaviour" => {println ("Я веду себя как владелец") }} отвергает определение, получает = masterReceive orElse super.receive} , Где получают, метод, который я вынужден осуществить в родительской черте, и я просто создаю новую частичную функцию для нового поведения в подклассе и приковываю их цепью с orElse.
добавлено автор Alex, источник

Одна вещь, которая приходит на ум, состоит в том, чтобы сделать что-то вроде этого:

trait ClockActor {
  def pf:PartialFunction[String, Boolean] = {
    case "a" => true
    case v if(_pf.isDefinedAt(v)) => _pf.apply(v)
  }

  def _pf:PartialFunction[String, Boolean] = Map.empty
}

object MasterClock extends ClockActor {

  override def _pf:PartialFunction[String, Boolean] = {
    case "b" => false
  }

  println(pf("a"))
  println(pf("b"))

}

который произведет:

scala> MasterClock
true
false

Стоимость , верный , поступает из определения в частичной функции Черты , ClockActor , , ложный , происходит из Объекта MasterClock .

1
добавлено
@Alex, я заставил быстрое отредактировать, который мог бы помочь больше с тем, чего вы надеетесь достигать. Я изменил черту, чтобы иметь две функции, одна pf , который будет общественным и _pf , который по умолчанию пуст и был бы отвергнут в классе по мере необходимости. Это - по существу то же самое как, что я имел прежде, но этот способ, которым пользователь не должен волноваться о запросе супер начиная с общественных требований, был бы к pf функция черты.
добавлено автор jcern, источник
Да это работает. У меня, казалось, была идея, что, когда вы "отвергаете" функцию тогда, вы наклоняетесь, касаются оригинала. Если я буду иметь тогда, то я буду использовать этот способ сделать вещи, но I' m ищущий больше путь, который люди, которые осуществляют подклассы don' t должны заботиться о запросе супер или любом внедрении в родительской черте.
добавлено автор Alex, источник
Получил работу вариантов, но совершенно другой путь. класс, MasterNode расширяет treeNode {определение masterReceive:Receive = {случай "specificBehaviour" => {println ("Я веду себя как владелец") }} отвергает определение, получает = masterReceive orElse super.receive} , Где получают, метод, который я вынужден осуществить в родительской черте, и я просто создаю новую частичную функцию для нового поведения в подклассе и приковываю их цепью с orElse.
добавлено автор Alex, источник
pro.jvm
pro.jvm
3 503 участник(ов)

Сообщество разработчиков Java Scala Kotlin Groovy Clojure Чат для нач-их: @javastart Наш сайт: projvm.com projvm.ru Наш канал: @proJVM Вакансии: @jvmjobs Конфы: @jvmconf

Scala User Group
Scala User Group
1 486 участник(ов)

[RU] Scala Chat. Rules, additional links, FAQ: https://telegra.ph/Russian-Speaking-Scala-User-Group-08-27

Scala Jobs
Scala Jobs
852 участник(ов)

Rules: http://telegra.ph/My-lyudi-i-ehto-znachit-chto-nam-nuzhna-organizaciya-02-07 Main Scala Channel: https://t.me/scala_jobs_feed Flood Room: https://t.me/scala_ponv