Scala的重载和默认参数限制:如何避免写下很多组合?

Posted

技术标签:

【中文标题】Scala的重载和默认参数限制:如何避免写下很多组合?【英文标题】:Scala's overloading and default parameter limitations: how to avoid writing down many combinations? 【发布时间】:2013-09-09 21:50:24 【问题描述】:

我最近发现 Scala 不允许同一方法的多个重载版本具有默认参数。我有一组方法重载,如果(且仅当)指定了一个主要参数,则需要隐式参数。这将是“主要”方法:

def replies(after: Option[Post] = None, limit: Option[Int] = None)
           (implicit db: Instance, order: QueryOrdering[Post]): Stream[Post]

这从具有基本分页的数据库中获取条目。如果指定了after,则根据order,只应检索逻辑上跟随它的条目。但是对于未提供after 的情况,我不想指定order。但是下面的代码是不允许的,因为只有一个重载可以有默认参数:

def replies(limit: Option[Int] = None)
           (implicit db: Instance): Stream[Post]
  replies(limit = limit)(db, QueryOrdering.noOp)   

我可以为所有可能的参数组合写下方法:

def replies()(implicit db: Instance)
def replies(after: Post)(implicit db: Instance, order: QueryOrdering[Post])
def replies(limit: Int)(implicit db: Instance)

但这很麻烦,并且容易出现超过 2 个参数的组合爆炸。有没有更好的建模方法?

【问题讨论】:

【参考方案1】:

还没有人说过“磁铁图案”吗?

The magnet blog is here.

每个人都必须在午休时间。

然后,您可以控制哪些隐式可用于打包给定的 args 组合。

Sample answer.

Or tersely.

【讨论】:

以上是关于Scala的重载和默认参数限制:如何避免写下很多组合?的主要内容,如果未能解决你的问题,请参考以下文章

函数重载遇到引用和默认参数

重载的目的是什么

在JAVA中能给方法参数赋默认值吗

C++中重载函数详解

函数重载

在 Scala/Chisel 中使用类型参数覆盖/重载运算符