Рассмотрим определение одиночной функции , найденной в бесформенном репо:
/** Polymorphic function selecting an arbitrary element from a non-empty `Set`. */
object choose extends (Set ~> Option) {
def apply[T](s : Set[T]) = s.headOption
}
Сравните ее с традиционным синтаксисом def
в следующем примере:
package utils
object UtilWithASingleMethod {
def isSatisfyingSomePredicate(foo: Foo): Boolean = ???
}
против
package utils
object isSatisfyingSomePredicate extends (Foo => Boolean) {
def apply(foo: Foo): Boolean = ???
}
Обратите внимание, что сайт вызова теперь становится
isSatisfyingSomePredicate(foo)
вместо
UtilWithASingleMethod.isSatisfyingSomePredicate(foo)
или
import UtilWithASingleMethod._
isSatisfyingSomePredicate(foo)
ЛичноПакет, UtilWithASingleMethod
кажется вынужденным просто использовать знакомый синтаксис def
, но не добавляет никакой полезной информации.
Помимо субъективных недостатков, таких как незнакомость или путаница с объектом + стиль применения, используемый в фабричном шаблонеЕсть ли какие-либо технические недостатки с определениями одноэлементных функций?