0

有没有办法导入特定的方法签名?

def test() {
  lazy val log = LoggerFactory.getLogger("AndroidProxy")
  import log.{error, debug, info, trace}

  trace("This is a test")
  trace "This is also"   // <- This line will not compile 
}

也许这是不可能的,但我的主要目标是在不添加新方法的情况下允许这样做。我试过这些无济于事

import log.{error => error(_:String)}
import log.{error(x: String) => error(x)}

我想主要的挑战是所有的方法都需要一个参数。我可以在没有 () 的情况下调用无参数方法,并且我可以创建一个省略 . 的方法调用链,例如foo getX toString,但我不知道如何自动创建一个 arity-1 调用

这是对这个问题的跟进。

4

2 回答 2

3

不,没有办法导入特定的方法签名。

于 2013-02-16T04:23:04.987 回答
3

代码的问题:

trace "This is also"   // <- This line will not compile 

并不是说您以某种方式导入了太多的重载变体——trace而是您不能以这种方式使用 Scala 的中缀表示法。像这样的表达式:

e op

被解释为“后缀操作”(参见Scala 语言规范的第 6.12.2 节),相当于调用:

e.op

所以你的代码相当于:

trace."This is also"

这当然是一个编译错误。

如果您改为使用形式的“Infix Operation” ( Scala 语言规范e1 op e2的第 6.12.3 节),那么即使方法重载也不会出现任何问题:

scala> class Logger { def trace(s: String) = "1arg"; def trace(i: Int, s: String) = "2arg" }
defined class Logger

scala> val log = new Logger
log: Logger = Logger@63ecceb3

scala> log trace "This is also"
res0: String = 1arg
于 2013-02-16T20:42:28.410 回答