我正在尝试编写一个类,当你调用类中定义的函数时,它会将它存储在一个函数数组中而不是立即执行它,然后用户调用exec()
来执行它:
class TestA(val a: Int, newAction: Option[ArrayBuffer[(Int) => Int]]) {
val action: ArrayBuffer[(Int) => Int] = if (newAction.isEmpty) ArrayBuffer.empty[(Int) => Int] else newAction.get
def add(b: Int): TestA = {action += (a => a + b); new TestA(a, Some(action))}
def exec(): Int = {
var result = 0
action.foreach(r => result += r.apply(a))
result
}
def this(a:Int) = this(a, None)
}
然后这是我的测试代码:
"delayed action" should "delay action till ready" in {
val test = new TestA(3)
val result = test.add(5).add(5)
println(result.exec())
}
这给了我16的结果,因为3次传递两次并且加了两次。我想解决这个问题的简单方法是不要传递第二轮的值,比如将val a: Int
更改为val a: Option[Int]
。它有所帮助,但它没有解决我的真正问题:让第二个函数知道第一次执行的结果。
有没有人有更好的解决方案?或者,如果这是一种模式,任何人都可以共享它的教程吗?
答案 0 :(得分:1)
只需将操作结果保存在'结果'变量(用' a'实例化)并使用前一个结果作为当前迭代的输入
def exec(): Int = {
var result = a
action.foreach(r => result = r.apply(result))
result
}
或使用更具功能性的解决方案
def exec(): Int = {
action.foldLeft(a)((r, f) => f.apply(r))
}