当我想使用隐式方法来转换
功能
去别的地方。
为了测试的目的,我在scala 2.8中实现了一个小型DSL。它应该支持对实例的各种检查(断言,如果您愿意的话)。整个DSL有点复杂,但下面的简化示例说明了我的问题:
object PimpMyFunction {
class A(val b: Int)
def b(a: A) = a.b
class ZeroCheck(f: A => Int) {
def isZeroIn(a: A) = f(a) == 0
}
implicit def fToCheck(f: A => Int): ZeroCheck = new ZeroCheck(f)
def main(args: Array[String]) {
val a0 = new A(0)
val a1 = new A(1)
println(fToCheck(b).isZeroIn(a0))
println(fToCheck(b).isZeroIn(a1))
println(b.isZeroIn(a0))
}
}
前两行println(当我显式调用转换方法时)可以编译并正常工作,但最后一行(当我想依赖implicits时)会产生错误:
Compile error: missing arguments for method b in object PimpMyFunction; follow this method with '_' if you want to treat it as a partially applied function
如果我想隐式地转换“普通”实例(不是函数),它也会以同样的方式工作,那么我猜问题与范围/导入无关。
如果我按照错误消息的说明使用
println((b _).isZeroIn(a0))
它也可以工作,但是DSL是针对非技术人员的,所以我希望尽可能保持语法的整洁和简单。
我认为我还有另一个解决方法(B应该是一个扩展断言特性的类,该特性已经包含了check方法+A=>int),它支持更清晰的语法,但是它会更冗长、更不灵活,所以我更喜欢隐式方法。
有什么办法可以避免
(b _)
语法和仍然使用暗示?