10

在我的 Scala 项目中,我几乎所有的文件都有这些导入:

import eu.timepit.refined._
import eu.timepit.refined.api.Refined
import eu.timepit.refined.auto._
import eu.timepit.refined.numeric._

import spire.math._
import spire.implicits._

import com.wix.accord._
import com.wix.accord.dsl._

import codes.reactive.scalatime._

import better.files._

import java.time._

import scala.collection.mutable
...
...

在 Scala 中干燥这个的最好方法是什么?我可以为我的项目(使用某种 sbt 插件?)或在包级别指定所有这些吗?

4

2 回答 2

7

我已经看到了一些可以解决您正在寻找的方法的方法。查看

导入定义

https://github.com/mongodb/casbah/blob/master/casbah-core/src/main/scala/Implicits.scala

这种方法的小例子:

object Imports extends Imports with commons.Imports with query.Imports with query.dsl.FluidQueryBarewordOps

object BaseImports extends BaseImports with commons.BaseImports with query.BaseImports

object TypeImports extends TypeImports with commons.TypeImports with query.TypeImports

trait Imports extends BaseImports with TypeImports with Implicits

@SuppressWarnings(Array("deprecation"))
trait BaseImports {
  // ...
  val WriteConcern = com.mongodb.casbah.WriteConcern
  // More here ...
}

trait TypeImports {
  // ...
  type WriteConcern = com.mongodb.WriteConcern
  // ... 
}

使用的进口

https://github.com/mongodb/casbah/blob/master/casbah-core/src/main/scala/MongoClient.scala

当他们使用这个导入对象时,它会为您解锁所有类型别名。例如,WriteConcern

import com.mongodb.casbah.Imports._
// ...
def setWriteConcern(concern: WriteConcern): Unit = underlying.setWriteConcern(concern)

本质上,他们将所有导入包装到一个公共 Import 对象中,然后只需使用 import com.mycompany.Imports._

Doobie 做了类似的事情,大多数最终用户只是import doobie.imports._

https://github.com/tpolecat/doobie/blob/series/0.3.x/yax/core/src/main/scala/doobie/imports.scala

同样,来自此模式的示例:

object imports extends ToDoobieCatchSqlOps with ToDoobieCatchableOps {
  /**
   * Alias for `doobie.free.connection`.
   * @group Free Module Aliases
   */
  val FC   = doobie.free.connection

  /**
   * Alias for `doobie.free.statement`.
   * @group Free Module Aliases
   */
  val FS   = doobie.free.statement

  // More here ...
}

这种方法在包对象样式之间的主要区别在于您可以更好地控制导入的内容/时间。我已经使用了这两种模式,通常是我需要跨内部包的常用实用程序方法的包对象。对于库,特别是我的代码的用户,我可以将某些隐式定义附加到doobie上面提到的导入对象,这将为使用单个导入的用户解锁 DSL 语法。

于 2016-10-07T19:17:34.407 回答
4

我可能会采用这种scala.Predef方法:基本上,为类型设置别名并公开我想要提供的对象。所以例如

package com.my

package object project {
  type LocalDate = java.time.LocalDate
  type LocalDateTime = java.time.LocalDateTime
  type LocalTime = java.time.LocalTime

  import scala.collection.mutable

  type MutMap[A, B] = mutable.Map[A, B]
  val MutMap = mutable.Map
  // And so on....
}

现在,无论您以 开头的文件package com.my.project,上述所有内容都将自动可用。顺便说一句,还要感谢@som-snytt指出这一点

于 2016-10-10T02:24:08.320 回答