我有这段代码:
for( i <- 0 to 8){
((numbers(i) - i)/3).abs + ((numbers(i) - i)%3).abs
}
我希望如标题所示,这样做
for( i <- 0 to 8){
by3(numbers(i), i, /) + by3(numbers(i), i, %)
}
def by3(a: Int, b: Int, op: Int => Int) = ((a - b) op 3).abs
并且可能还使用部分应用的功能..但到现在这可能实现?怎么样?
答案 0 :(得分:17)
首先,您需要将op
正确定义为函数(具体而言,Function2
)
def operate(a: Int, b: Int, op: (Int, Int) => Int ) : Int = (op ((a - b), 3)).abs
Scala中的运算符实际上是方法:+是Scala OO基础中的Int(和Long,Double,...)方法。然后,要将操作符(方法)作为函数传递,可以使用下划线表示法提升它:
operate(5, 3, _ + _)
答案 1 :(得分:10)
要删除下划线,您需要将函数定义为值。
val / = (a:Int, b: Int) => a / b
val % = (a:Int, b: Int) => a % b
def by3(a: Int, b: Int, fn: (Int, Int) => Int): Int = fn(a - b, 3).abs
(0 to 8).foreach(i => by3(numbers(i), i, /) + by3(numbers(i), i, %))
答案 2 :(得分:6)
编辑/更新:
简明扼要,最简单的方法是:
def doStuff(a: Int, b: Int, op: (Int, Int) => Int) = {op(a - b, 3).abs}
doStuff(4,1,_%_)
所以你可以doStuff(numbers(i), i, _ / _) + doStuff(numbers(i), i, _ % _)