scala - 没有隐式参数的函数可以使用隐式 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*)
)
解决方案
在这种情况下,我们根本不是在谈论隐式参数,而是在谈论隐式转换。每当编译器找到一个A
,但需要一个B
,它可以自动应用表单的函数implicit def func(_: A): B
来使转换/赋值成为可能。
简单的例子:
implicit def string2int(s: String): Int = s.toInt
val i: Int = "2"
请注意,为了使其工作,您需要显式导入scala.language.implicitConversions
或使用编译器标志来启用该功能。
推荐阅读
- python - pip --version 和 pip -h 工作,但 pip install 在 Win10 下不起作用(Powershell
- u-boot - 更换以太网物理层:对 Devicetree 和 uboot 的影响
- python - 如何从我在 Python Tkinter 中生成的条目表中获取数据?
- postgresql - pg_trgm 相似度的计算
- android - registerForActivityResult 是否能够作为 ACTION_CHOOSER
- node-html-pdf - 我想打一个 API,它应该采用 HTML 字符串并下载一个 pdf 文件。使用 nodejs
- kubernetes - 在 Pod 上挂载外部 NFS 共享并拒绝访问文件
- python - python中从1到n的素数
- python-3.x - 如何将 django-allauth 用户与自定义用户模型连接
- javascript - 如何在 javascript/jquery 中为“24 小时”时间格式添加一小时?