Scala中如何将隐式Context映射为方法所需的Tracker隐式参数
错误原因
你之前把隐式转换定义在repo的伴生对象中无法生效,是因为Scala的隐式解析默认只会搜索参数类型对应的伴生对象作用域,repo的伴生对象不属于Tracker或Context的关联作用域,所以不会被自动搜索到。
可选解决方案
方案1:在Context的伴生对象中定义隐式转换(推荐,无额外导入成本)
将转换逻辑放在Context的伴生对象中,属于隐式解析的默认搜索范围,只要作用域内存在隐式Context实例,就能自动转换出Tracker:
// 注意修正原代码的语法错误,case后面要加class case class Context(tracker: Tracker) object Context { implicit def getTrackerFromContext(implicit ctx: Context): Tracker = ctx.tracker }
方案2:在Repo方法内临时声明隐式Tracker
如果你不想定义全局隐式转换,可以直接在调用方法的作用域内声明隐式值:
// 类名遵循Scala规范首字母大写 class Repo(process: Processor){ def get(id: String)(implicit ctx : Context): Unit = { implicit val tracker: Tracker = ctx.tracker process.get(id) } }
方案3:手动传参(最直接,无隐式黑盒)
不需要改任何隐式定义,直接把Context中的Tracker显式作为隐式参数传入:
class Repo(process: Processor){ def get(id: String)(implicit ctx : Context): Unit = { process.get(id)(ctx.tracker) } }
如果你坚持要把转换放在Repo的伴生对象中
只需要在Repo类中手动导入伴生对象的隐式成员即可生效:
object Repo { implicit def contextToTracker(implicit ctx: Context): Tracker = ctx.tracker } class Repo(process: Processor){ import Repo._ // 导入伴生对象的隐式转换 def get(id: String)(implicit ctx : Context): Unit = { process.get(id) } }
内容的提问来源于stack exchange,提问作者athomassi
相关产品推荐
相关产品推荐

