scala - 为什么不将函数定义为单例函数?
问题描述
考虑在无形回购中找到的单例函数的定义:
/** 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
package 似乎只是为了能够使用熟悉的def
语法而没有添加任何有用的信息。
除了诸如不熟悉或与工厂模式中使用的对象+应用样式混淆等主观缺点外,单例函数定义是否有任何技术缺点?
解决方案
他们必须在您链接的文件中创建单例对象的原因是那些不是函数,而是多态函数,即它们有一个apply[T](a: F[T]): G[T]
由类型参数普遍量化的方法T
。这对于普通函数来说根本不需要,它所做的只是增加了apply
在单例对象上调用方法的开销,foo
而不是foo
直接调用方法。它也不能帮助你“避免”包和导入,因为无论如何你都希望在某个包中拥有这个对象,你不想将它转储到默认的根包中。
如果你想避免“强制”UtilWithASingleMethod
命名空间,那么isSatisfyingSomePredicate
直接添加到util
:
package object util {
def isSatisfyingSomePredicate(foo: Foo): Boolean = ???
}
此方法在您导入后立即可用util._
。
推荐阅读
- jsp - JSP 包含页面。将参数传回给调用者
- c++ - 带有子成员的 C++ 子类
- python - 如何在python3中找到文件的长度?
- sql - 仅选择最近登录日期的一组
- javascript - 使用 post api 调用在按钮单击时重新加载嵌套数据表
- postgresql - 我是否需要更高的事务隔离才能使约束在 PostgreSQL 中可靠地工作?
- javascript - JavaScript if/else 语句赋值变量 true 或 false
- xamarin - 最新的 BLE.net Nuget 包中缺少 BluetoothLowEnergyAdapter
- javascript - 使用 SweetAlert2 提交确认表单
- ios - 更新 Firebase 中的数据会删除旧的子节点并使用 SWIFT 替换它