4

以下来自A Tour of Scala的示例展示了如何使用隐式来根据类型提供适当的缺失成员(add 和 unit)。编译器将在范围内选择正确的隐式对象。例如,该库还将其与and或and一起使用。List.sortByOrderingList.sumNumeric

但是,B 类中的以下用法是隐式参数的有效/推荐用法(与 A 类中不使用隐式参数相反):

class I

class A {
  def foo(i:I) { bar(i) }
  def bar(i:I) { baz(i) }
  def baz(i:I) { println("A baz " + i) }
}
(new A).foo(new I)

class B {
  def foo(implicit i:I) { bar }
  def bar(implicit i:I) { baz }
  def baz(implicit i:I) { println("B baz " + i) }
}
(new B).foo(new I)

在沿堆栈传递参数时,我主要使用隐式在调用站点为自己节省一些输入。

4

2 回答 2

3

它看起来并不像隐式的惯用用法,它往往适用于类型类和依赖注入。传递一个没有成员的班级绝对没有意义......

I在调用之前定义隐式 val 或类型对象也更常见(new B).foo

说了这么多,你显然提供了一个非常抽象的例子。因此,不难想象一个遵循类似模式的隐式的合理用例。

于 2010-11-10T16:35:06.857 回答
3

这是一个非常好的用例。当范围确定要使用的参数时,我实际上建议这样做。它提供了一种优雅的方式将某种上下文传递给插件类,以便实用程序函数使用该上下文。例如:

trait Context

object UtilityLib {
  def performHandyFunction(implicit x : Context) : SomeResult = ...
}

trait Plugin {
   def doYourThing(implicit ctx : Context) : Unit
}

class MyPlugin extends Plugin {
  def doYourThing(implicit ctx : Context) : Unit = {
    UtilityLib.performHandyFunction
  }
}

SomePluginAPI.register(new MyPlugin)

You can see an example in a database migration system I was toying. Check out the Migration class and its MigrationContext.

于 2010-11-10T16:55:01.133 回答