【问题标题】:Marking an argument implicit inside a method将参数标记为隐含在方法中
【发布时间】:2012-08-23 03:24:21
【问题描述】:

我有一个方法可以调用其他一些使用Foo 类型的隐式方法。我想让 f 隐含在 Foo 中。我就是这样做的:

def myMethod(a: Int, f: Foo) = {
  implicit val implicitF = f;
  somethingThatNeedsFoo(a) 
}

我不想在 myMethod 的签名中隐含标记 f,因为 Foos 在使用 myMethod 的上下文中并不隐含。我的问题:有没有比使用临时变量更惯用(或简洁)的方式来实现这种效果?

【问题讨论】:

  • 在这个简单的例子中,直接传递f 可能比使用隐式更容易——但我假设你的真实代码足够复杂,足以让隐式变得有价值。在这种情况下,如果您想避免在方法签名中将参数本身声明为隐式,我认为您在方法内声明 implicit val 的解决方案是最好的方法。
  • @DaoWen 你真的应该提交你的评论作为答案。
  • @Aaron Novstrup - 是的,看看我可能应该得到的其他答案。我在这里还是很新,所以我仍然很难决定什么属于答案与评论的类别。

标签: scala implicit


【解决方案1】:

我从未见过实际使用过它,但您可以避免将变量绑定到名称。当然,使用下划线:

implicit val _ = f

不过,我建议不要使用这种用法。

【讨论】:

  • 反对这种用法的原因是什么?我喜欢它避免使用永远不会使用的标识符污染本地命名空间,并且代码中的“噪音”更少。可能会出现令人困惑的编译器错误?
  • 我认为这可能会令人困惑,因为下划线也可能被视为“完全忽略/禁用此隐式”。 (如import Predef.{any2stringadd => _, _}。)
【解决方案2】:

您可以显式传递隐式参数,因此即使调用者的隐式范围内没有 Foo,调用者也可以显式传递它。

正如评论,您可以使用相同的技巧将 Foo 传递给somethingThatNeedsFoo

 def myMethod(a: Int, f: Foo) =
   somethingThatNeedsFoo(a)(f) 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-30
    • 2014-02-24
    • 1970-01-01
    • 2012-01-14
    • 2012-08-15
    • 2014-03-03
    • 2016-02-13
    相关资源
    最近更新 更多