首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Scala中的捆绑包导入

Scala中的捆绑包导入
EN

Stack Overflow用户
提问于 2016-09-09 06:00:29
回答 2查看 647关注 0票数 10

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

代码语言:javascript
复制
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插件?)还是在包级别?

EN

回答 2

Stack Overflow用户

发布于 2016-10-08 03:17:34

我已经看到了一些方法,它们可以解决您正在寻找的问题。检查

导入已定义的

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

这种方法的一个小示例:

代码语言:javascript
复制
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

代码语言:javascript
复制
import com.mongodb.casbah.Imports._
// ...
def setWriteConcern(concern: WriteConcern): Unit = underlying.setWriteConcern(concern)

本质上,它们将所有的导入封装到一个通用的导入对象中,然后只需使用导入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

同样,此模式中的一个示例:

代码语言:javascript
复制
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语法。

票数 7
EN

Stack Overflow用户

发布于 2016-10-10 10:24:08

我可能会使用scala.Predef approach:基本上,为类型添加别名,并公开我想要提供的对象。因此,例如

代码语言:javascript
复制
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启动文件,上述所有内容都将自动可用。顺便说一句,pointing this out的@som snytt也值得称赞。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39400828

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档