gpt4 book ai didi

scala - 我可以模仿 Scala SIP-18-syle 导入吗?

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

斯卡拉 SIP 18提供了一种强制用户提供导入语句以使用某些高级或不安全语言功能的方法。例如,为了使用 higher kinded types , 你需要

import scala.language.higherKinds

或者你会得到一个编译器警告,告诉你正在使用高级功能。

有什么方法可以在我自己的库中重现或模仿这种行为?例如我可能有:
trait MongoRepository[E <: Entity] {
val casbahCollection: com.mongodb.casbah.MongoCollection
}

我做了 casbahCollection public 将基础集合公开给用户,以备不时之需。但这真的不是我希望我的用户做的事情,因为它是一个泄漏的抽象。所以我想强制他们做这样的事情:
import my.library.mongo.leakyAbstraction

在做这样的事情之前:
widgetRepo.casbahCollection.find()

是否可以?有没有什么方法可以提供比仅仅在文档中放置一个丑陋的警告更有效的类似行为?

最佳答案

你可以用隐含的方式伪造它,类似于 Await.result 的方式。在 scala.concurrent 工作.

首先创建一个sealed trait代表直接访问您的 DAO 的“许可”:

@implicitNotFound("Import my.library.mongo.leakyAbstraction to directly access Mongo")
sealed trait CanAccessMongo

然后是一个扩展它的对象:
implicit object leakyAbstraction extends CanAccessMongo

这些必须在同一个文件中。通过制作 CanAccessMongo密封,同一文件之外的代码将无法扩展它。

然后在 MongoRepository制作 cashbahCollection一个函数(将 val 更改为 def )。您可能需要一个实际创建它的私有(private) val,但我们需要该函数来限制访问。
def cashbahCollection(implicit permit: CanAccessMongo) = ...

现在您图书馆的用户必须携带 leakyAbstraction进入范围以调用该函数。如果不这样做,他们将收到 implicitNotFound 中指定的错误消息。 .

明显的缺点是你所有的库代码都必须有 leakyAbstraction。在范围内也是如此。

关于scala - 我可以模仿 Scala SIP-18-syle 导入吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31664252/

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