来自上下文案例类的隐式 val
Posted
技术标签:
【中文标题】来自上下文案例类的隐式 val【英文标题】:Implicit val from context case class 【发布时间】:2021-11-14 13:37:28 【问题描述】:我有一个案例类:
case Context(tracker: Tracker)
我有一个带有 get def 的处理器类,它期望 Tracker 的隐式参数定义为:
class Processor()
def get(id: String)(implicit tracker: Tracker): Unit
我有我的呼叫班:
class repo(process: Processor)
def get(id: String)(implicit ctx : Context): Unit
process.get(id)
有没有一种简单的方法可以让我从上下文 -> Tracker 进行映射?我一直在尝试在“repo”的伴侣中使用隐式 def,但在调用 process.get(id) 时仍然看到 Tracker 的“没有可用的隐式 val”
【问题讨论】:
你控制Context
还是Tracker
?
我控制上下文。我可以是明确的,但如果有办法支持不明确,我宁愿这样做
@athomassi 将 Dmytro 建议的隐式转换放在 Context
的伴随对象上,它应该可以按预期工作。
@LuisMiguelMejíaSuárez Tracker
的伴侣,而不是 Context
@LuisMiguelMejíaSuárez 谢谢,我没有注意到 OP 的评论。搜索到隐式转换的源类型,但ifContextThenTracker
不是隐式转换。
【参考方案1】:
你可以在作用域中定义隐式
implicit def ifContextThenTracker(implicit c: Context): Tracker = c.tracker
我一直在尝试在“repo”的伴侣中使用隐式 def,但在调用 process.get(id) 时仍然看到 Tracker 的“没有可用的隐式 val”
隐式解析规则见Where does Scala look for implicits?
如果您可以访问它,您可以将ifContextThenTracker
放入Tracker
的伴随对象中。否则你可以导入隐式。
【讨论】:
问题是它不会使 c.tracker 在上下文中隐式,我想避免显式调用,因为我喜欢隐式的干净程度。编辑:刚刚看到您的编辑,现在检查 @athomassi 请查看更新。这能回答你的问题吗? 我将隐式 def 添加到上下文中,然后导入上下文并且工作正常。非常感激! =) @athomassi 如果将ifContextThenTracker
放入Tracker
的同伴中,则不必导入隐式,否则(如果将其放入Context
的同伴中,则将其放入@987654328 的同伴中@ 等)你必须这样做。以上是关于来自上下文案例类的隐式 val的主要内容,如果未能解决你的问题,请参考以下文章
为啥我的隐式 ContextMenu 样式不会覆盖 TextBox 上下文菜单样式?