我有一些基於Akka的actor系統,其中多種actor是基於相同模板的,這是因爲這些actor只有不同的響應值類型。例如:如何避免在模式匹配警衛中顯式.isDefinedAt()調用
final case class Request(data: Any)
final case class Response(data: Any)
abstract class ActorTemplate[T] extends Actor {
def dataFunction: PartialFunction[Any, T]
def respond(data: T): Response
def receive: Receive = {
case Request(data) if dataFunction.isDefinedAt(data) =>
sender ! respond(dataFunction(data))
}
}
部分函數有避免類型擦除方法,該方法防止我簡單
def receive: Receive = {
case Request(data: T) =>
sender ! respond(data)
,並在同一時間強迫我上產生圖案if dataFunction.isDefinedAt(data)
防護件和我只是不要我不喜歡它。
有什麼辦法可以避免明顯的防範?
只有這樣我發現現在是介紹一些愚蠢的提取:
object DataExtractor {
def unapply(data: Any): Option[T] =
if (dataFunction.isDefinedAt(data)) Some(dataFunction(data)) else None
}
def receive: Receive = {
case Request(DataExtractor(data) =>
sender ! respond(data)
但或許它是在標準庫中已經某處做了什麼?或者,也許有其他方法類似於收集collect
方法,但匹配?
結論
後的一些想法,我又回到提取物,並用@幫助pagoda_5b建議移動它變成一個特點:
trait PFExtract[T] {
object PF {
def unapply(any: Any)(implicit pf: PartialFunction[Any, T]): Option[T] =
pf.lift(any)
}
}
'dataFunction'的類型簽名似乎拼寫錯誤。它應該是'PartialFunction [Any,T]' –
修復它,謝謝。 – Seigert
pagoda_5b有很好的建議,但你的提取器也不錯。 – sourcedelica