gpt4 book ai didi

scala - Scala 中的隐式类

转载 作者:行者123 更新时间:2023-12-02 07:27:00 24 4
gpt4 key购买 nike

我有以下一段代码。我必须确认它是否是这样工作的。任何人都可以为此提供解释

object Implicits
{
implicit class RichSeq[A](val xs:Seq[A])
{
def mapD[B](function:A => B):Seq[B] = xs.map(function)
}
}

这有点像 map 上的抽象,我可以将其与序列一起使用。因此,如果我导入此 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)

我想知道这是如何工作的,因为当我在类型 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)

如果类的构造函数恰好采用一个非隐式参数,则可以将类注释为隐式

这是相关文档,您可以在其中阅读更多相关信息:http://docs.scala-lang.org/overviews/core/implicit-classes.html


在您的具体示例中,这意味着任何 Seq[A] 都可以隐式提升到 RichSeq[A] 中。

编译器会找到隐含的,因为你导入了它,所以它在范围内可用。

你可以看到这段代码的实际java输出

val x = Seq(1, 2, 3)
x.mapD(_ + 22)

通过使用带有选项 -Xprint:typer 的 scala REPL。这是输出的相关部分

$line3.$read.$iw.$iw.Implicits.RichSeq[Int]($line3.$read.$iw.$iw.x).mapD[Int](((x$1: Int) => x$1.+(22)));

经过一些润色后相当于

Implicits.RichSeq(x).mapD(x$1 => x$1 + 22)

作为旁注,您只需导入 Implicits._。具体的隐式解析规则可以引用Where does Scala look for implicits?

关于scala - Scala 中的隐式类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27013854/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com