【问题标题】:Can an implicit def be used by a function that does not have an implicit param?没有隐式参数的函数可以使用隐式 def 吗?
【发布时间】:2021-02-23 16:16:38
【问题描述】:

我在this blog 遇到了这个代码块。我想知道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*)

【问题讨论】:

  • 不,您将implicit values (或参数)implicit conversions 混淆了。希望these - materials 帮助。顺便说一句,在这种情况下,作者使用implicit conversions 来模拟magnet pattern
  • div(h1("Hello World"), p("I am a paragraph")) 实际上是div(h1(stringFrag("Hello World")), p(stringFrag("I am a paragraph")))h1p 没有必要隐含。 stringFrag 是隐含的就足够了。

标签: scala implicit-conversion implicit


【解决方案1】:

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

简单示例:

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

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

【讨论】:

    猜你喜欢
    • 2011-11-09
    • 1970-01-01
    • 2021-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-12
    相关资源
    最近更新 更多