没有找到隐含的def

时间:2016-02-03 21:56:43

标签: scala implicit

var total = parseFloat(miles.value) * k

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

  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") } 添加隐式调用?

1 个答案:

答案 0 :(得分:2)

首先,如果表达式没有进行类型检查,则可以使用隐式转换将一种类型转换为另一种类型。然而,表达式在语法上是有效的。此

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

不是语法上有效的表达式。参数列表不是表达式,不能单独存在,因此您得到编译器错误。

此外,隐式转换可能只有一个参数(可能还有其他隐式参数)。具有两个参数的隐式方法永远不能用作转换,仅作为某些隐式参数的参数。

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

我建议你用其他运算符替换逗号并重载它。像%%

这样的东西