考虑一下在无型回购中发现的单点函数的定义:
/** 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语法,但没有添加任何有用的信息。
除了主观方面的缺点,如不熟悉,或与工厂模式中使用的object+apply风格混淆之外,单例函数定义还有什么技术上的缺点吗?
发布于 2019-06-30 19:38:11
他们必须在您链接的文件中创建单例对象的原因是,它们不是函数,而是多态函数,也就是说,它们有一个apply[T](a: F[T]): G[T]方法,该方法由类型参数T普遍量化。这是普通函数所不需要的,它所做的只是增加在单个对象foo上调用foo方法的开销,而不是直接调用方法foo。它也无助于“避免”包和导入,因为您希望在某个包中包含这个对象,所以您不希望将它转储到默认的根包中。
如果要避免“强制”UtilWithASingleMethod命名空间,则直接将isSatisfyingSomePredicate添加到util中。
package object util {
def isSatisfyingSomePredicate(foo: Foo): Boolean = ???
}一旦导入util._,此方法就可用。
发布于 2020-06-01 16:08:48
Scala 3 (Dotty)支持图层定义而不是
package utils
object UtilWithASingleMethod {
def isSatisfyingSomePredicate(foo: Foo): Boolean = ???
}我们可以移除间接,然后写
package utils
def isSatisfyingSomePredicate(foo: Foo): Boolean = ???这确实解决了我的问题。
https://stackoverflow.com/questions/56827474
复制相似问题