首页 > 解决方案 > 没有隐式参数的函数可以使用隐式 def 吗?

问题描述

我在这个博客上遇到了这个代码块。我想知道如何h1("Hello World")能够编译自h1(children: Frag*).

object TheirCode{
  trait Frag{
    def render: String
  }
  // HTML constructors
  def div(children: Frag*): Frag
  def p(children: Frag*): Frag
  def h1(children: Frag*): Frag
  ...
  implicit def stringFrag(s: String): Frag
}

object MyCode{
  import TheirCode._
  val frag = div(
    h1("Hello World"),
    p("I am a paragraph")
  )
  frag.render // <div><h1>Hello World</h1><p>I am a paragraph</p></div>
}

我猜测implicit def stringFrag自动转换h1(String)为,h1(Frag)但我一直认为方法参数需要隐式前缀才能工作(即implicit h1(children: Frag*)

标签: scalaimplicit-conversionimplicit

解决方案


在这种情况下,我们根本不是在谈论隐式参数,而是在谈论隐式转换。每当编译器找到一个A,但需要一个B,它可以自动应用表单的函数implicit def func(_: A): B来使转换/赋值成为可能。

简单的例子:

implicit def string2int(s: String): Int = s.toInt
val i: Int = "2"

请注意,为了使其工作,您需要显式导入scala.language.implicitConversions或使用编译器标志来启用该功能。


推荐阅读