4

の A Tour of Scala のは、タイプに基づいて適切な欠落メンバー (add および unit) を提供するために、implicit を使用する方法を示しています。コンパイラは、スコープ内の適切な暗黙的オブジェクトを選択します。ライブラリは、たとえば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

これは非常に優れたユースケースです。スコープが使用するパラメーターを決定するときに、これを実際にお勧めします。これは、ユーティリティ関数がコンテキストを使用するように、ある種のコンテキストをプラグインクラスに渡すための洗練された方法を提供します。例えば:

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)

私が試していたデータベース移行システムの例を見ることができます。MigrationクラスとそのMigrationContextを確認してください。

于 2010-11-10T16:55:01.133 に答える
3

これは、型クラスと依存性注入に適している傾向がある Implicit の慣用的な使用方法のようには見えません。メンバーのいないクラスについて渡すことはまったく意味がありません...

Iへの呼び出しを行う前に、型の暗黙的な val またはオブジェクトを定義することもより一般的です。(new B).foo

そうは言っても、あなたは明らかに非常に抽象的な例を提供しました。したがって、同様のパターンに従う暗黙の合理的なユースケースを想像するのはそれほど難しくありません。

于 2010-11-10T16:35:06.857 に答える