繁体   English   中英

在Scala中隐含对象

[英]implicits for objects in Scala

我对Joshua Suareth的书Scala中的“5.1.3隐式解决方案”中的描述感到困惑,第100页:

Scala对象不能包含implicits的伴随对象。 因此,必须从外部作用域提供与该对象类型的隐式作用域所需的对象类型相关的隐含。 这是一个例子:

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

但是我在REPL中隐藏了对象Bar:

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

似乎它不需要在外部范围中定义隐式。 或者我认为约书亚的意思完全错了?

在这种情况下,对象就好像它们是自己的伙伴一样,所以你只需要在对象本身的体内嵌套对象类型提示的含义,

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的隐式范围的Bar.type

这可能看起来是Scala类型系统的一个模糊的角落,但我能够很好地利用无形状多态(函数)值编码。

如果您将以下代码放在一个文件中并尝试使用scalac进行编译,则使用'implicit' modifier cannot be used for top-level objects失败并'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并不完全是顶层因此看似不一致。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM