#scala
#scala
Вопрос:
в scala play framework я видел этот код:
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:
Double => Double
это просто сокращение от Function[Double, Double]
. PartialFunction
наследуется от Function
, но добавляет несколько методов. Самое главное, он добавляет метод isDefinedAt
, который позволяет вам запрашивать, определена ли функция для некоторого параметра.
case
s без совпадения — это специальный синтаксис для определения частичных функций, который генерирует, isDefinedAt
который возвращает true
для всех совпадающих case
функций.
Допустим, у нас есть функция, которая возвращает 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 для реализации библиотеки actor, где Actor может использовать только определенные типы сообщений.