Тип PartialFunction - PullRequest
       3

Тип PartialFunction

5 голосов
/ 30 апреля 2011

в фреймворке Scala Play Я видел этот код:

abstract class AnalyserInfo
case class ColumnC(typeName:String,fieldName:String) extends AnalyserInfo
case class TableC(typeName:String) extends AnalyserInfo

    val asIs :PartialFunction[AnalyserInfo,String] = {
      case ColumnC(_,f) => f;
      case TableC(typeName) => typeName
    }

В чем разница с:

val asIs: (AnaliserInfo)=>String = (info) => info match {
  case ColumnC(_,f) => f;
  case TableC(typeName) => typeName
}

Есть предпочтительный стиль?и почему в первом случае ключевое слово match может быть опущено?

Спасибо за поддержку.

1 Ответ

8 голосов
/ 30 апреля 2011

Double => Double это просто сокращение для Function[Double, Double].PartialFunction наследуется от Function, но добавляет несколько методов.Что наиболее важно, он добавляет метод isDefinedAt, который позволяет запрашивать, определена ли функция для какого-либо параметра.

case без совпадения - это специальный синтаксис для определения частичных функций, который генерируетisDefinedAt, который возвращает true для всех соответствующих case s.

Скажем, у нас есть функция, которая возвращает 1 / x, но только для положительных значений x, мы могли бы определить ее как:

scala> val f: (Double => Double) = { case x if x > 0 => 1/x }             
f: (Double) => Double = <function1>

или как:

scala> val g: PartialFunction[Double, Double] = { case x if x > 0 => 1/x }
g: PartialFunction[Double,Double] = <function1>

Преимущество второй версии состоит в том, что мы можем проверить, применима ли функция к какому-либо параметру:

scala> g.isDefinedAt(-3)
res0: Boolean = false

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...