延迟执行一系列操作

时间:2015-03-28 18:10:46

标签: scala

我正在尝试编写一个类,当你调用类中定义的函数时,它会将它存储在一个函数数组中而不是立即执行它,然后用户调用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]。它有所帮助,但它没有解决我的真正问题:让第二个函数知道第一次执行的结果。

有没有人有更好的解决方案?或者,如果这是一种模式,任何人都可以共享它的教程吗?

1 个答案:

答案 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))
}