Viv*_*966 2 functional-programming scala
我有以下代码.我必须确认它是如何工作的方式.任何人都可以为此提供解释
object Implicits
{
implicit class RichSeq[A](val xs:Seq[A])
{
def mapD[B](function:A => B):Seq[B] = xs.map(function)
}
}
Run Code Online (Sandbox Code Playgroud)
这就像地图上的抽象,我可以使用序列.因此,如果我导入此Implicits.RichSeq,我可以使用任何Seq [A]上的方法,因为这会将Seq [A]转换为RichSeq [A].
import Implicits.RichSeq._
val xs:Seq[Int] = Seq(22,33)
val output:Seq[Int] = xs.mapD(_+22)
Run Code Online (Sandbox Code Playgroud)
我想知道它是如何工作的,因为当我在Seq [A]类型上使用mapD时,它将搜索从Seq [A]到RichSeq [A]的隐式转换.它会找到这个隐式转换,因为这是一个隐式类?
它是否将隐式类扩展为:
隐式def RichSeq [A](val xs:Seq [A])= new RichSeq(xs)
我想它可能在里面做这些东西.对此ne1知道吗?
隐式类只是一种简写
class Foo(a: A)
implicit def pimpMyA(a: A) = new Foo(a)
Run Code Online (Sandbox Code Playgroud)
您可以注释一个类,就implicit好像它的构造函数只接受一个非隐式参数一样.
以下是您可以阅读更多相关文档的相关文档:http://docs.scala-lang.org/overviews/core/implicit-classes.html
在您的具体示例中,它意味着任何Seq[A]可以隐式提升为RichSeq[A].
编译器会找到隐式的,因为您导入了它,因此它在范围内可用.
您可以看到此代码的实际java输出
val x = Seq(1, 2, 3)
x.mapD(_ + 22)
Run Code Online (Sandbox Code Playgroud)
通过使用带有选项的scala REPL -Xprint:typer.这是输出的相关位
$line3.$read.$iw.$iw.Implicits.RichSeq[Int]($line3.$read.$iw.$iw.x).mapD[Int](((x$1: Int) => x$1.+(22)));
Run Code Online (Sandbox Code Playgroud)
经过一些抛光后相当于
Implicits.RichSeq(x).mapD(x$1 => x$1 + 22)
Run Code Online (Sandbox Code Playgroud)
作为旁注,您只需导入即可Implicits._.对于确切的隐式解析规则,您可以参考Scala在哪里寻找隐含?