没有隐式参数的函数可以使用隐式 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
或使用编译器标志来启用该功能。
我在 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
或使用编译器标志来启用该功能。