8

Scala 仕様 (2.8) によると、暗黙的が見つかるには、ローカル スコープ、継承されたスコープ、またはコンパニオンオブジェクトで定義する必要があります。それを考えると、次のコードは、コンパニオン オブジェクトの内容を明示的にインポートしなくても機能するはずです。これは Scala ライブラリ ソース (例: CanBuildFrom) で使用されています。また、XX クラスの定義の外側から XX.foo() を呼び出して、コンパニオン クラスの暗黙のパラメーターを使用できるようにする必要があるようです。私は何が欠けていますか?

object XX {
   implicit def XYZ[T]: (T) => Unit = null
}

class XX {
  // import XX._     // Works with this line uncommented...
  def foo(s: String)(implicit f: (String) => Unit): Unit = {
    if (f == null)
      println("Just: " + s)
    else
      f(s)
  }

  def bar {
    foo("abc"){ s => println("Func: " + s)}
    foo("xyz")  // <-- Compile error here: could not find implicit value for parameter f
  }
}
4

1 に答える 1

10

私は常に仕様を、定義を含むクラスではなく、暗黙パラメーターのコンパニオン オブジェクトで定義できることを意味すると解釈しました。このようなもの:

object ZZ {
   implicit val xyz: ZZ = new ZZ()
}
class ZZ {
  def bar: (String) => Unit = null
}

class XX {
  def foo(s: String)(implicit f: ZZ): Unit = {
    if (f.bar == null)
      println("Just: " + s)
    else
      f.bar(s)
  }

  def bar {
    foo("xyz")
  }
}

仕様のセクション 7.2 で明らかなようです。

型 T の暗黙的なパラメーターに渡すことができる実引数は、2 つのカテゴリに分類されます。まず、プレフィックスなしでメソッド呼び出しの時点でアクセスでき、暗黙の定義 (§7.1) または暗黙のパラメーターを示すすべての識別子 x が適格です。したがって、適格な識別子は、ローカル名、またはそれを囲むテンプレートのメンバーである可能性があります。あるいは、インポート句 (§4.7) によって接頭辞なしでアクセスできるようになっている可能性があります。このルールの下で適格な識別子がない場合、2 番目に 、暗黙的なパラメーターの型 T の暗黙的なスコープに属するオブジェクトのすべての暗黙的なメンバーも適格です。

定義の包含クラスのコンパニオン オブジェクトを示す部分を引用できますか?

于 2011-01-20T16:44:01.353 に答える