作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
当我想使用隐式方法将函数转换为其他东西时,我遇到了一些问题。
出于测试目的,我正在 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 (当我显式调用转换方法时)编译并工作正常,但最后一行(当我想依赖隐式时)产生错误:编译错误:在对象 PimpMyFunction 中缺少方法 b 的参数;如果您想将其视为部分应用的功能,请在此方法后面加上'_'
如果我想以同样的方式隐式转换“普通”实例(不是函数),那么我猜这个问题与范围/导入无关。
如果我按照错误消息的说明使用 println((b _).isZeroIn(a0))
它也可以,但是 DSL 是针对非技术人员的,所以我会喜欢保持语法尽可能简洁。
我想我有另一个解决方法(b 应该是一个扩展 Assertions trait 的类,它已经包含检查方法 + A => Int),它将支持更简洁的语法,但它会更冗长且不太灵活,所以我更喜欢隐式的方式。
任何想法如何避免 (b _)
语法并仍然使用隐式?
最佳答案
Scala 要求您编写 (b _) 以确保您确实希望将方法 b 装箱为函数值。如果不想写下划线,直接将b定义为函数值而不是方法:
val b = (a: A) => a.b
关于scala - 在 scala 中拉皮条我的函数 - 对函数应用隐式转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3288385/
我是一名优秀的程序员,十分优秀!