Scala的重载和默认参数的限制:如何避免写下许多组合?(Scala's overloadi

2019-10-18 14:38发布

我最近发现的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个参数。 有没有更好的方式来建模呢?

Answer 1:

没有人说“磁铁模式”了吗?

磁铁博客在这里。

每个人都必须在午休。

然后你控制什么implicits可用来包装参数的个数给出的组合。

示例答案。

或简洁。



文章来源: Scala's overloading and default parameter limitations: how to avoid writing down many combinations?
标签: scala