Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/jsf/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala中的捆绑导入_Scala_Import_Sbt_Sbt Plugin - Fatal编程技术网

Scala中的捆绑导入

Scala中的捆绑导入,scala,import,sbt,sbt-plugin,Scala,Import,Sbt,Sbt Plugin,在我的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.acc

在我的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插件)或在包级别指定所有这些方法吗?

我已经看到一些方法可以解决您的问题。退房

导入已定义的

这种方法的一个小例子:

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
  // ... 
}
使用的导入

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

import com.mongodb.casbah.Imports._
// ...
def setWriteConcern(concern: WriteConcern): Unit = underlying.setWriteConcern(concern)
实际上,它们将所有导入打包到一个公共导入对象中,然后只使用Import com.mycompany.imports_

Doobie做了一些类似的事情,大多数最终用户只是
导入Doobie.imports.\uu

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

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语法。

我可能会使用:基本上,别名类型并公开我想要提供的对象。例如

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。

将别名放入package object com.acme,然后每个文件都是
package com.acme;软件包projectx
。不需要导入。@som snytt:我不明白你的评论-也许发布一个新的答案?你可以使用从我的原稿中导入的内容question@pathikrit我的意思是像另一个答案一样,从封装的包中提取别名。但是很快你就可以使用
-Yimports
来定制Predef了。我认为该选项的语法在2.13之前可能会更改,但是
-Yimports:com.acme.\u
或类似的版本。您能从OP的原始问题中的导入来回答这个问题吗?我知道Scala和Java库中的简单内容是如何以这种方式工作的,但所有cats/spire导入又如何?@pathikrit要将大量隐式内容导入到大量文件中,我没有一个好的解决方案。事实上,现在我甚至建议不要在文件的顶部进行一揽子导入,而是在尽可能紧凑的范围内(本地)导入: