mar*_*ops 0 scala implicit implicit-conversion
我在这个博客上遇到了这个代码块。我想知道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>
}
Run Code Online (Sandbox Code Playgroud)
我猜会implicit def stringFrag自动转换h1(String)为,h1(Frag)但我一直认为方法参数需要隐式前缀才能工作(即implicit h1(children: Frag*))
小智 5
在这种情况下,我们根本不讨论隐式参数,而是隐式转换。每当编译器找到 an A,但需要 a 时B,它可以自动应用该形式的函数implicit def func(_: A): B以使转换/赋值成为可能。
简单的例子:
implicit def string2int(s: String): Int = s.toInt
val i: Int = "2"
Run Code Online (Sandbox Code Playgroud)
请注意,为了使其工作,您需要显式导入scala.language.implicitConversions或使用编译器标志来启用该功能。