没有隐式参数的函数可以使用隐式 def 吗?

Can an implicit def be used by a function that does not have an implicit param?

我在 this blog 上看到了这个代码块。我想知道自 h1(children: Frag*).

以来 h1("Hello World") 是如何编译的
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*))

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

简单示例:

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

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