6

Joshua Suareth の本 Scala in depth の "5.1.3 Implicit resolution" の 100 ページにあるこの説明に混乱しています。

Scala オブジェクトは、暗黙のコンパニオン オブジェクトを持つことはできません。このため、そのオブジェクトの型の暗黙のスコープで必要な、オブジェクトの型に関連付けられた暗黙は、外側のスコープから提供する必要があります。次に例を示します。

scala> object Foo {
     |   object Bar { override def toString = "Bar" }
     |   implicit def b : Bar.type = Bar 
     |}
defined module Foo
scala> implicitly[Foo.Bar.type]
res1: Foo.Bar.type = Bar

しかし、オブジェクト Bar を REPL で暗黙的にしますが、次のようになります。

scala> object Foo {
     |   implicit object Bar {
     |     override def toString = "isBar" }
     | }
defined module Foo
scala> implicitly[Foo.Bar.type]
res0: Foo.Bar.type = isBar

外側のスコープで暗黙的に定義する必要はないようです。それとも、ジョシュアの意味を完全に間違っているのでしょうか?

4

2 に答える 2

8

このシナリオでは、オブジェクトはあたかも自分のコンパニオンであるかのように動作するため、オブジェクト自体の本体に object-type-mentioning 暗黙をネストするだけで済みます。

scala> object Bar {
     |   override def toString = "Bar"
     |   implicit def b : Bar.type = Bar
     | }
defined module Bar

scala> implicitly[Bar.type]
res0: Bar.type = Bar

ここで、 の本体は、Barを解決するための暗黙のスコープの一部と見なされていることに注意してくださいBar.type

これは Scala の型システムのあいまいなコーナーに見えるかもしれませんが、私はそれをshapelessの多形 (関数) 値のエンコーディングでうまく利用することができました。

于 2013-03-19T13:46:08.497 に答える
2

次のコードをファイルに入れて、それを使用してコンパイルしようとすると、次のようscalacに失敗します。'implicit' modifier cannot be used for top-level objects

 implicit object Foo {
  object Bar { override def toString = "Bar" }
 }

ただし、これは正常にコンパイルされます。

 object Foo {
  implicit  object Bar { override def toString = "Bar" }
 }

を使用することREPL implicit'sは正確にトップレベルではないため、矛盾しているように見えると思います。

于 2013-03-19T12:12:19.600 に答える