San*_*ozi 3 scala implicit scala-2.8
当我想使用隐式方法将函数转换为其他函数时,我遇到了一些问题.
我正在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))
}
}
Run Code Online (Sandbox Code Playgroud)
前两个的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应延伸的断言性状已经含有检查方法的类+ A =>强度),将支持所述清洁器的语法,但它会更详细和弹性较差,所以我宁愿隐含的方式.
任何想法如何避免(b _)语法仍然使用含义?
Scala要求您编写(b _)以确保您确实希望将方法b装箱为函数值.如果您不想编写下划线,请直接将b定义为函数值而不是方法:
val b = (a: A) => a.b
Run Code Online (Sandbox Code Playgroud)