未找到隐式定义

Implicit def not being found

  val commands = Map("ctrl" -> "^", "anythingToLeft" -> "::")
  val ctrl = "^";
  val anythingToLeft = "::";

  case class Commands(val list: List[String]) {
    def and(that: String) = Commands(that :: list)
  }
  implicit def l(cmd: String) = Commands(cmd :: Nil)

  implicit def f(c: Commands, fun: => Unit) = {
    val launchCommand = c.list.reverse.mkString("") + "::"

    println(launchCommand)
    println(fun);
  }

  f(ctrl and "j", {
    println("ddd")
  })

上面的代码片段打印了以下内容:

^j::
ddd
()

这是我所期望的。如果我改为这样做,我会收到 ';' expected but ',' found 错误:

ctrl and "j", {
    println("ddd")
  }

为什么编译器不在第二个版本中添加对 f 的隐式调用?

首先,如果表达式不进行类型检查,则可以使用隐式转换将一种类型转换为另一种类型。但是,表达式必须在句法上有效。这个

ctrl and "j", {
  println("ddd")
}

不是语法上有效的表达式。参数列表不是表达式,不能独立存在,因此会出现编译器错误。

此外,隐式转换可能只有一个参数(可能还有更多的隐式参数)。带有两个参数的隐式方法永远不能用作转换,只能用作某些隐式参数的参数。

您可以做的是提供从元组的隐式转换。转换不会应用于独立的元组,因为只有在某些表达式没有它的情况下不进行类型检查时才会应用转换。

我建议您用其他运算符替换逗号并重载它。类似 %%