【发布时间】:2023-03-22 15:44:01
【问题描述】:
注意:如果有人能为我想问的问题想出一个更好的标题 - 请提及或编辑。
给定一个包装方法:
trait MyWrapperBound {
val message: String
}
def wrap[T <: MyWrapperBound](message: String): T
我正在寻找一种方法来描述MyWrapperBound 的所有实现都应该有一个接受message: String 的构造函数,这样我就可以从我的wrap 方法构造并返回它。
我可以想到几种方法来做到这一点:
方法 1 - 使用隐式:
def wrap[T <: MyWrapperBound](message: String)(implicit factory: String => T): T
这意味着任何MyWrapperBound impl。还必须创建隐式:
case class SimpleBound(message: String) extends MyWrapperBound
object SimpleBound {
implicit def factory(message: String): SimpleBound = SimpleBound(message)
}
这会产生相当多的样板文件——我想避免这种情况。
方法 2 - 宏:
def wrap[T <: MyWrapperBound](message: String): T = macro ...
宏将采用类型,断言存在有效的构造函数,如果存在则构造类型,如果不存在则抛出一个很好的编译错误供开发人员去修复(通过添加有效的构造函数)
我的问题是 - 对 scala 来说相当新,是否有一个更简单的选项我错过了?还是其他更有意义的选择?
【问题讨论】:
-
方法一和方法二是不同的东西。在方法 1 中,您将讨论如何使用隐式实现它,在方法 2 中,您将讨论如何使用宏进行验证。您的意思是说您要使用方法 2 中的宏为该类型生成构造函数?
-
是的,它们是实现同一目标的不同方式。方法 2 只会在构造函数已经存在的情况下验证和使用构造函数。如果它不存在,则由开发人员自行添加以修复编译时错误。
-
@YuvalItzchakov - 我刚刚看到我犯的错误,我相信这导致了你的评论。宏版本并不意味着有一个隐式参数....抱歉有任何混淆。