Scala 在方法中标记隐式参数

Scala 在方法中标记隐式参数,scala,implicit,Scala,Implicit,我有一个方法,它调用了一些其他方法,这些方法使用了Foo类型的隐式函数。我想在Foo中隐式地使用f。我就是这样做的: def myMethod(a: Int, f: Foo) = { implicit val implicitF = f; somethingThatNeedsFoo(a) } 我不想在myMethod的签名中标记f,因为在使用myMethod的上下文中,foo不是隐式的。我的问题是:有没有比使用临时变量更惯用(或简洁)的方法来实现这种效果?您可以显式传递隐式参数,因此

我有一个方法,它调用了一些其他方法,这些方法使用了
Foo
类型的隐式函数。我想在Foo中隐式地使用f。我就是这样做的:

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

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

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

如前所述,您可以使用相同的技巧将Foo传递给
所需的某物Foo

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

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

implicit val _ = f

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

在这个简单的示例中,显式传递
f
可能比使用隐式更容易,但我假设您的实际代码足够复杂,因此隐式传递是值得的。在这种情况下,如果您不想在方法签名中将参数本身声明为隐式的,我认为您在方法中声明
隐式val
的解决方案是最好的方法。@DaoWen您真的应该提交您的注释作为答案。@Aaron Novstrup-是的,看看我可能应该给出的其他答案。我在这里还是个新手,所以我仍然很难决定什么是答案还是评论。反对这种用法的理由是什么?我喜欢它避免了用一个永远不会被使用的标识符污染本地名称空间,并且代码中的“噪音”更少。可能会混淆编译器错误?我认为可能会混淆,因为下划线也可能被视为“忽略/禁用此隐式”。(如在
import Predef.{any2stringadd=>\uu,}