我可以模仿Scala SIP-18-syle进口吗?
Scala
SIP 18提供了一种强制用户提供导入语句以使用某些高级或不安全语言功能的方法.例如,为了使用
higher kinded types,您需要
import scala.language.higherKinds 或者您将收到一个编译器警告,告诉您正在使用高级功能. 有什么方法可以在我自己的库中重现或模仿这种行为吗?例如,我可能有: trait MongoRepository[E <: Entity] { val casbahCollection: com.mongodb.casbah.MongoCollection } 我已经使casbahCollection公开,以便在需要时向用户公开底层集合.但它真的不是我希望我的用户做的事情,因为它是一个漏洞的抽象.所以我想强迫他们做这样的事情: import my.library.mongo.leakyAbstraction 在做这样的事情之前: widgetRepo.casbahCollection.find() 可能吗?有没有什么方法可以提供类似的行为,比在文档中放置一个大的丑陋警告更有效? 解决方法
您可以使用隐式伪造它,类似于Await.result在scala.concurrent中的工作方式.
首先创建一个密封的特征,代表直接访问DAO的“许可证”: @implicitNotFound("Import my.library.mongo.leakyAbstraction to directly access Mongo") sealed trait CanAccessMongo 然后是一个扩展它的对象: implicit object leakyAbstraction extends CanAccessMongo 这些必须在同一个文件中.通过使CanAccessMongo密封,同一文件外的代码将无法扩展它. 然后在MongoRepository中使cashbahCollection成为一个函数(将val更改为def).您可能想要一个实际创建它的私有val,但我们需要该函数来限制访问. def cashbahCollection(implicit permit: CanAccessMongo) = ... 现在,您的库的用户必须将leakyAbstraction带入范围才能调用该函数.如果他们不这样做,他们将得到implicitNotFound中指定的错误消息. 显而易见的缺点是,所有库代码都必须在范围内具有leakyAbstraction. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |