gpt4 book ai didi

scala - Scala 中的捆绑导入

转载 作者:行者123 更新时间:2023-12-02 04:37:23 25 4
gpt4 key购买 nike

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

最佳答案

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

定义导入

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)

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

Doobie 做了类似的事情,大多数最终用户只是导入 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 语法。

关于scala - Scala 中的捆绑导入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39400828/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com