首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么不将函数定义为单例函数?

为什么不将函数定义为单例函数?
EN

Stack Overflow用户
提问于 2019-06-30 19:27:30
回答 2查看 83关注 0票数 1

考虑一下在无型回购中发现的单点函数的定义:

代码语言:javascript
复制
/** 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语法进行对比:

代码语言:javascript
复制
package utils

object UtilWithASingleMethod {
  def isSatisfyingSomePredicate(foo: Foo): Boolean = ???
}

对比

代码语言:javascript
复制
package utils

object isSatisfyingSomePredicate extends (Foo => Boolean) {
  def apply(foo: Foo): Boolean = ???
}

注意呼叫站点现在是如何变成的。

代码语言:javascript
复制
isSatisfyingSomePredicate(foo)

而不是

代码语言:javascript
复制
UtilWithASingleMethod.isSatisfyingSomePredicate(foo)

代码语言:javascript
复制
import UtilWithASingleMethod._

isSatisfyingSomePredicate(foo)

就个人而言,UtilWithASingleMethod包似乎被迫使用熟悉的def语法,但没有添加任何有用的信息。

除了主观方面的缺点,如不熟悉,或与工厂模式中使用的object+apply风格混淆之外,单例函数定义还有什么技术上的缺点吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-06-30 19:38:11

他们必须在您链接的文件中创建单例对象的原因是,它们不是函数,而是多态函数,也就是说,它们有一个apply[T](a: F[T]): G[T]方法,该方法由类型参数T普遍量化。这是普通函数所不需要的,它所做的只是增加在单个对象foo上调用foo方法的开销,而不是直接调用方法foo。它也无助于“避免”包和导入,因为您希望在某个包中包含这个对象,所以您不希望将它转储到默认的根包中。

如果要避免“强制”UtilWithASingleMethod命名空间,则直接将isSatisfyingSomePredicate添加到util中。

代码语言:javascript
复制
package object util {
  def isSatisfyingSomePredicate(foo: Foo): Boolean = ???
}

一旦导入util._,此方法就可用。

票数 6
EN

Stack Overflow用户

发布于 2020-06-01 16:08:48

Scala 3 (Dotty)支持图层定义而不是

代码语言:javascript
复制
package utils

object UtilWithASingleMethod {
  def isSatisfyingSomePredicate(foo: Foo): Boolean = ???
}

我们可以移除间接,然后写

代码语言:javascript
复制
package utils

def isSatisfyingSomePredicate(foo: Foo): Boolean = ???

这确实解决了我的问题。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56827474

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档