В рамках моего путешествия, изучая Scala, а затем Akka, я пытаюсь понять, как можно определить PartialFunction
.
. В курсе "Программирование реактивных систем" приведен примерАктер:
class Toggle extends Actor {
def happy: Receive = {
case "How are you?" =>
sender ! "happy"
context become sad
}
def sad: Receive = {
case "How are you?" =>
sender ! "sad"
context become happy
}
def receive = happy
}
Это довольно просто, и я бы сказал, я понимаю, что он пытается сделать.То, что я не понимаю, это то, что happy
и sad
имеют тип Function1
(или, по крайней мере, это мое убеждение), и все же они могут играть роль PartialFunction
(receive
нуждается в PartialFunction).
И, что еще хуже, согласно документации Akka , receive
должен возвращать PartialFunction
(не одно):
abstract def receive: Actor.Receive
Scala API: это определяет начальное поведение актера, оно должно возвращать частичную функцию с логикой актера.
Но насколько ямогу сказать, happy
и sad
не возвращают PartialFunction
, они едины.
Чтобы подвести итог моих вопросов:
- Есть ли способ определить
PartialFunction
против Function1
? - Я неправильно прочитал пример?Разве
receive
a PartialFunction
не возвращает Unit
?Если ответ «да», то почему в документации сказано, что receive
должен возвращать PartialFunction
?
[ОБНОВЛЕНИЕ]
На основании ответаЯ получил от @Brian McCutchon, теперь я знаю, что метод receive
должен возвращать PartialFunction
.Но это не поможет с моей путаницей вообще!Рассмотрим следующий сценарий:
def someFunction(): Receive = {
//Instantiates and returns a Receive object
}
class Toggle {
def happy: Receive = {
case "How are you?" =>
someFunction()
}
}
Мой вопрос: как компилятор Scala узнает, должен ли данный код быть расширен до этого:
class Toggle {
def happy: Receive = {
return {
case "How are you?" =>
someFunction() // <-- The returned object of this function call is dismissed
}
}
}
Или это:
class Toggle {
def happy: Receive = { // <-- Starting point of happy's body
case "How are you?" =>
someFunction() // <-- The Receive object is returned by this method
}
}
Или, что более важно, откуда мне знать, какое расширение произойдет?И я думал, что современные языки программирования должны быть более читабельными !!!