1

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

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

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

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 个参数的组合爆炸。有没有更好的方法来建模这个?

4

1 回答 1

1

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

磁铁博客在这里。

每个人都必须午休。

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

示例答案。

或者简洁。

于 2013-09-05T22:41:31.560 回答